J'ai un script de sauvegarde que je dois exécuter à un moment particulier de la journée, donc j'utilise cron
pour cette tâche et depuis cron j'essaye également de rediriger la sortie du script de sauvegarde vers un logfile
.
crontab -e
*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log
Dans l'entrée ci-dessus, je redirige les deux stderr and stdout
dans un fichier journal.
Le travail cron ci-dessus s'exécute correctement selon syslog
et il exécute la tâche mentionnée dans le backup.sh
fichier mais il 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 requis 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:~$
Alors, pourquoi la sortie du fichier n'est pas redirigée vers le fichier depuis cron.
J'ai résolu le problème. Il y a deux façons:
M1
Modifiez la redirection de &>>
à 2>&1
. Alors maintenant crontab -e
ressemble à
*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1
je crois ce qui précède fonctionne parce que par défaut cron
utilise sh
pour exécuter la tâche au lieu de bash
so &>>
n'est pas pris en charge par sh
.
M2
Modifiez le shell par défaut en ajoutant Shell=/bin/bash
dans le crontab -e
fichier.
clause de non-responsabilité [1].
Je voudrais ajouter une note de bas de page ou un addendum à @ réponse de RanRag .
Assurez-vous que votre syntaxe de redirection Shell est conforme à /bin/sh
. Si vous essayez d'utiliser une syntaxe de redirection Shell qui n'est pas valide avec /bin/sh
alors votre commande échouera et votre tâche cron ne sera jamais exécutée.
Dans ton /etc/cron.d/example1
fichiers de configuration si vous spécifiez un utilisateur autre que root
et que le shell de connexion de cet utilisateur n'est pas /bin/bash
... vous devez toujours utiliser la syntaxe/bin/sh dans /etc/cron.d/example1
commande.
Si votre utilisateur a Shell csh
ou zsh
ou ksh
défini pour son shell de connexion. Dans ton /etc/cron.d/example1
fichier de configuration, la commande doit utiliser /bin/sh
syntaxe. Plus précisément, toute redirection Shell doit être /bin/sh
syntaxe.
Si vous essayez d'utiliser par exemple csh
la syntaxe de redirection du shell dans votre /etc/cron.d/example1
, alors votre tâche cron ne s'exécutera jamais. Le fichier journal de crond
situé à /var/log/cron
indiquera que la commande est exécutée mais la commande produira une erreur de syntaxe avant que votre commande ne soit exécutée.
crond
émet-il des messages d'erreur pour une erreur de syntaxe?L'erreur n'est jamais signalée dans /var/log/cron
. crond
à la place, par défaut, émet tous les messages d'erreur à l'aide de mail
. Vous devez donc vérifier /var/spool/mail/${USER}
pour voir quelle est l'erreur.
[1]
sysv
systemd
les informations peuvent différercentos-6
distro et peut ne pas s'appliquer à différentes sysv
distributions centos-6
en particulier, car différentes distributions peuvent avoir une implémentation crond
différente de centos-6