web-dev-qa-db-fra.com

Comment rediriger la sortie vers un fichier depuis Cron?

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.

120
RanRag

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.

173
RanRag

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.


Par exemple

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]

Avertissement

  • Cette réponse suppose un système sysv
  • systemd les informations peuvent différer
  • Plus précisément, ces informations ont été apprises pour centos-6 distro et peut ne pas s'appliquer à différentes sysv distributions
    • Je mentionne centos-6 en particulier, car différentes distributions peuvent avoir une implémentation crond différente de centos-6
6