私は1日の特定の時間に実行する必要があるバックアップスクリプトがあるので、このタスクにcron
を使用しており、cron内からバックアップスクリプトの出力をlogfile
。
crontab -e
*/1 * * * * /home/ranveer/backup.sh &>> /home/ranveer/backup.log
上記のcronエントリでは、両方のstderr and stdout
をログファイルにリダイレクトしています。
上記のcronジョブはsyslog
に従って正常に実行され、backup.sh
ファイルに記載されているタスクを実行しますが、ログファイルには何も書き込みません。
/var/log/syslog
Oct 19 20:26:01 ranveer CRON[15214]: (ranveer) CMD (/home/ranveer/backup.sh &>> /home/ranveer/backup.log)
Cliからスクリプトを実行すると、スクリプトは必要に応じて機能し、出力はログファイルに書き込まれます
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:~$
では、なぜファイルの出力がcron内からファイルにリダイレクトされないのでしょうか。
私は問題を解決しました。 2つの方法があります。
M1
リダイレクトを&>>
から2>&1
に変更します。したがって、crontab -e
は次のようになります
*/1 * * * * /home/ranveer/vimbackup.sh >> /home/ranveer/vimbackup.log 2>&1
私は信じます上記は機能します。デフォルトではcron
はsh
ではなくbash
を使用してタスクを実行するため、&>>
はサポートされていません。 sh
による。
M2
Shell=/bin/bash
ファイルにcrontab -e
を追加して、デフォルトのシェルを変更します。
免責事項[1]。
@ RanRag's answer に脚注または補遺を追加したいと思います。
シェルのリダイレクト構文が/bin/sh
に準拠していることを確認してください。 /bin/sh
では無効なシェルリダイレクト構文を使用しようとすると、コマンドは失敗し、cronジョブは実行されません
/etc/cron.d/example1
構成ファイルで、root
以外のユーザーを指定し、そのユーザーのログインシェルが/bin/bash
ではない場合は、/etc/cron.d/example1
コマンドで/ bin/sh構文を使用する必要があります。
ユーザーがシェルcsh
またはzsh
またはksh
をログインシェルに設定している場合。 /etc/cron.d/example1
構成ファイルでは、コマンドは/bin/sh
構文を使用する必要があります。具体的には、シェルのリダイレクトは/bin/sh
構文でなければなりません。
たとえば、/etc/cron.d/example1
でcsh
シェルリダイレクト構文を使用しようとすると、cronジョブは実行されません。 /var/log/cron
にあるcrond
のログファイルには、コマンドは実行されたと書かれていますが、コマンドが実行される前に構文エラーでエラーになります。
crond
は構文エラーのエラーメッセージをどこに出力しますか?エラーは/var/log/cron
で報告されません。代わりに、crond
はデフォルトでmail
を使用してエラーメッセージを出力します。したがって、/var/spool/mail/${USER}
をチェックして、エラーの内容を確認する必要があります。
[1]
sysv
システムを想定していますsystemd
の情報は異なる場合がありますcentos-6
ディストリビューションについて学習されたものであり、異なるsysv
ディストリビューションには適用されない場合がありますcentos-6
とは異なるcrond
実装が異なるディストリビューションにある可能性があるため、centos-6
について具体的に触れます