Comment rediriger la sortie vers un fichier depuis cron?

105

J'ai un script de sauvegarde que je dois exécuter à une heure précise de la journée. Je l'utilise donc cronpour cette tâche. À partir de cron, j'essaie également de rediriger la sortie du script de sauvegarde vers un fichier logfile.

crontab -e

*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log

Dans l'entrée cron ci-dessus, je redirige les deux stderr and stdoutvers un fichier journal.

Le travail cron ci-dessus s'exécute correctement syslog et exécute la tâche mentionnée dans le backup.shfichier, mais n'écrit rien dans le fichier journal.

/var/log/syslog

Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)

Lorsque j'exécute le script à partir de cli, il fonctionne comme prévu et la sortie est écrite dans un fichier journal.

ranveer@ranveer:~$ ./backup.sh &>> backup.log 
ranveer@ranveer:~$ cat backup.log
Fri Oct 19 20:28:01 IST 2012
successfully copied testdir
test.txt successfully copied
-------------------------------------------------------------------------------------
ranveer@ranveer:~$ 

Donc, pourquoi la sortie du fichier n'est pas redirigée vers le fichier depuis cron.

RanRag
la source
superuser.com/questions/122246/…
Ciro Santilli a annoncé le

Réponses:

158

J'ai résolu le problème. Il y a deux manières:

M1

Changer la redirection de &>>à 2>&1. Alors maintenant crontab -eressemble à

*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1

Je crois que les travaux ci - dessus , car par défaut cronest d' utiliser shpour exécuter la tâche au lieu de bashsi &>>non pris en charge par sh.

M2

Changer le shell par défaut en ajoutant SHELL=/bin/bashdans le crontab -efichier.

RanRag
la source
14
cronest comme sh: il ne choisit pas un seul programme. Il y a beaucoup d'implémentations. L'implémentation la plus répandue est Vixie Cron. Je suis l'auteur (actuel, pas l'original) d'un autre. Je crois que la plupart des démons cron utiliseront le système sh, mais cela peut varier selon qu’il accepte ou non &>>. Certains démons cron (comme le mien) ne vous permettent pas de changer le shell qui exécute les lignes cron avec des SHELL=...lignes dans la crontab. Je suis content que vous ayez trouvé une solution qui fonctionne pour vous. Je pensais simplement que cela valait la peine de souligner que de nombreuses variables pourraient affecter le fait que cela fonctionne pour d'autres.
dubiousjim
Comment insérer YYYY-MM-DD_hh-mm-secdans le nom du fichier de sortie, de sorte que chaque nom de fichier soit différent et conservé sans réécriture?
Danijel
1
@Danijel: Cela devrait aider serverfault.com/questions/117360/…
RanRag
2
*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.logfait la même chose aussi.
Yanick Girouard
5

disclaimer [1].

Je voudrais ajouter une note de bas de page ou un addendum à la réponse de @RanRag .

Assurez-vous que votre syntaxe de redirection de shell est conforme /bin/sh. Si vous essayez d'utiliser une syntaxe de redirection de shell non valide, /bin/shvotre commande échouera et votre travail cron ne sera jamais exécuté.

Dans vos /etc/cron.d/example1fichiers de configuration, si vous spécifiez un utilisateur autre que rootet que son shell de connexion n'est pas /bin/bash... vous devez toujours utiliser la syntaxe / bin / sh dans la /etc/cron.d/example1commande.


Par exemple

Si votre utilisateur a un shell cshou zshou est kshconfiguré pour son shell de connexion. Dans votre /etc/cron.d/example1fichier de configuration, la commande doit utiliser la /bin/shsyntaxe. Plus précisément, toute redirection de shell doit être une /bin/shsyntaxe.

Si vous essayez par exemple d'utiliser la cshsyntaxe de redirection de shell dans votre /etc/cron.d/example1, votre travail cron ne sera jamais exécuté. Le fichier journal pour crondsitué à /var/log/crondoit indiquer que la commande est exécutée, mais cette dernière générera une erreur de syntaxe avant que votre commande ne soit exécutée.

D'où crondémettent les messages d'erreur pour une erreur de syntaxe?

L'erreur n'est jamais signalée dans /var/log/cron. crondà la place, émet par défaut les éventuels messages d'erreur avec mail. Donc, vous devez vérifier /var/spool/mail/${USER}quelle est l'erreur.

[1]

Avertissement

  • Cette réponse suppose un sysvsystème
  • systemd les informations peuvent différer
  • Plus précisément, ces informations ont été apprises pour la centos-6distribution et peuvent ne pas s’appliquer à différentes sysvdistributions.
    • Je mentionne centos-6spécifiquement, parce que différentes distributions peuvent avoir une crondimplémentation différente qui diffère decentos-6
Trevor Boyd Smith
la source
2
si vous souhaitez que votre /etc/cron.d/example1commande utilise un shell différent, vous pouvez utiliser set SHELL=dans votre /etc/cron.d/example1fichier de configuration.
Trevor Boyd Smith