web-dev-qa-db-ja.com

cron内からファイルに出力をリダイレクトする方法は?

私は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内からファイルにリダイレクトされないのでしょうか。

120
RanRag

私は問題を解決しました。 2つの方法があります。

M1

リダイレクトを&>>から2>&1に変更します。したがって、crontab -eは次のようになります

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

私は信じます上記は機能します。デフォルトではcronshではなくbashを使用してタスクを実行するため、&>>はサポートされていません。 shによる。

M2

Shell=/bin/bashファイルにcrontab -eを追加して、デフォルトのシェルを変更します。

173
RanRag

免責事項[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/example1cshシェルリダイレクト構文を使用しようとすると、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について具体的に触れます
6