J'ai un script de sauvegarde que je dois exécuter à une heure précise de la journée. Je l'utilise donc cron
pour 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 stdout
vers un fichier journal.
Le travail cron ci-dessus s'exécute correctement syslog
et exécute la tâche mentionnée dans le backup.sh
fichier, 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.
bash
io-redirection
cron
RanRag
la source
la source
Réponses:
J'ai résolu le problème. Il y a deux manières:
M1
Changer la redirection de
&>>
à2>&1
. Alors maintenantcrontab -e
ressemble àJe crois que les travaux ci - dessus , car par défaut
cron
est d' utilisersh
pour exécuter la tâche au lieu debash
si&>>
non pris en charge parsh
.M2
Changer le shell par défaut en ajoutant
SHELL=/bin/bash
dans lecrontab -e
fichier.la source
cron
est commesh
: 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èmesh
, 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 desSHELL=...
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.YYYY-MM-DD_hh-mm-sec
dans le nom du fichier de sortie, de sorte que chaque nom de fichier soit différent et conservé sans réécriture?*/1 * * * * /home/ranveer/vimbackup.sh &>> /home/ranveer/vimbackup.log
fait la même chose aussi.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/sh
votre commande échouera et votre travail cron ne sera jamais exécuté.Dans vos
/etc/cron.d/example1
fichiers de configuration, si vous spécifiez un utilisateur autre queroot
et que son shell de connexion n'est pas/bin/bash
... vous devez toujours utiliser la syntaxe / bin / sh dans la/etc/cron.d/example1
commande.Par exemple
Si votre utilisateur a un shell
csh
ouzsh
ou estksh
configuré pour son shell de connexion. Dans votre/etc/cron.d/example1
fichier de configuration, la commande doit utiliser la/bin/sh
syntaxe. Plus précisément, toute redirection de shell doit être une/bin/sh
syntaxe.Si vous essayez par exemple d'utiliser la
csh
syntaxe de redirection de shell dans votre/etc/cron.d/example1
, votre travail cron ne sera jamais exécuté. Le fichier journal pourcrond
situé à/var/log/cron
doit 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 avecmail
. Donc, vous devez vérifier/var/spool/mail/${USER}
quelle est l'erreur.[1]
Avertissement
sysv
systèmesystemd
les informations peuvent différercentos-6
distribution et peuvent ne pas s’appliquer à différentessysv
distributions.centos-6
spécifiquement, parce que différentes distributions peuvent avoir unecrond
implémentation différente qui diffère decentos-6
la source
/etc/cron.d/example1
commande utilise un shell différent, vous pouvez utiliser setSHELL=
dans votre/etc/cron.d/example1
fichier de configuration.