edo1z blog

プログラミングなどに関するブログです

Ubuntu - cron

Ubuntu16.04です。

cronを使うには、crontabコマンドを使います。 crontab -e とやるとcronの編集ができますが、cron -rとやるとcronの設定内容が消えるので、危ないので気を付けるようにとネットでよく書いてあります。紹介されているのは、crontab -eで直接編集するのではなく、別ファイルでcron内容を作成・編集してcrontabで読み込むことです。

$vim .crontab
$crontab .crontab

これで.crontabに書いた設定が反映されます。 ubuntu16.04の場合、cronの実行ログはデフォルトでは表示されないぽいです。またログの表示設定をしても、デフォルトでは、/var/log/cron.logは出力されず、/var/log/syslogに出力されるようです。実行ログのみでエラー内容や標準出力はログには残りません。/var/log/syslogにcronログを出力させるには、下記ファイルのcron関連のコメントを外してrsyslogを再起動します。

$vim /etc/rsyslog.d/50-default.conf
$systemctl restart rsyslog.service

cronで実行結果をログに出力させるには、下記のようにします。 .crontab

* * * * * echo 123 >> /var/log/cron.log 2>&1

2>&1の2は標準エラー出力、1は標準出力です。2を標準出力にリダイレクトさせることによって、エラーも出力されます。

複数コマンドを実行する場合、;か&&でつなげます。;は、前のコマンドがエラーでも次を実行します。&&はエラーだったら次を実行しません。複数コマンドを1行でつなげた場合、例えば下記のようにやっても最後のコマンドの出力以外は受け取れません。

$ echo 123 && echo 456 >> hoge.log
$ cat hoge.log
456

下記のようにすると、最初のコマンドのエラーも含めた出力がファイルに保存されます。

$ echo 123 >> hoge.log 2>&1 && echo 456 >> hoge.log 2>&1

下記なら、最初のechoに誤字があるので、その時点でエラーで終了し、エラー内容がファイルに出力されます。

$ echoo 123 >> hoge.log 2>&1 && echoo 456 >> hoge.log 2>&1