crontab
でのあれこれ
更新履歴
- 2022/12: Dockerでのcronの使用に関する記事のリンクを追加
基本はmanを見る
ここを見ると大抵のことは解決できると思います。
上のページを見て、この場合はどうなるんだろう、といったケースを試していきます。
また、日時指定については、以下のサイトが便利だと思いました:
*/3 * * * *
など打ち込んだ場合にどういうタイミングで実行するか教えてくれます。
実験方法
こちらは忘れそうなので、ここに記しておきます。cron
のログを見られるようにするまでが大変でした。
docker
を利用して試します。
docker run --name <NAME> -d --log-driver json-file alpine crond -f -l 0
でcrond
をフォアグラウンドで作動docker exec -it <NAME> sh
でコンテナにアタッチ- アタッチしたら、
crontab -e
で編集 - 内容は、試したいことを書いておく
- 保存して終了
- アタッチしたら、
exit
してデタッチ
1番目のコマンドの説明からいきます。
--name
指定は、exec
でのアタッチで指定しやすくするためにあります。
-d
のデタッチ指定は後でアタッチするためにあります。
--log-driver json-file
指定はcron
の結果を見るために指定しています。docker logs <NAME>
で結果を見ることができます。
イメージは軽量なalpineを使います。crond -f -l 0
でcrond
をフォアグラウンドで動作させ、ログ出力も多めにしています。
続いて2,3番目のコマンドについて。
コンテナを立ち上げたら、crontab
の設定をします。そのためにまずは、コンテナにアタッチします。exec
コマンドでアタッチできます。
アタッチしたらcrontab -e
で編集します。ここに試したいコマンド、表現などを打ち込みます。あとは保存して終了すればOKです。
分を指定しないで他を指定する
より細かい単位を指定せずに大きな単位を指定した場合どうなるのかみます。
crontabファイル:
* 19 * * * date
結果: 19時に毎分実行された。それ以外の時間帯は実行されなかった。19の代わりに1,2を指定すればman通り、1時と2時で1分ごとにコマンドが作動します。
mailの有無
crontab
ファイルにMAILTO=""
を指定しておくと、メール送信が必要な時にメールを送らないようにできます。送りたいときは、MAILTO=auser@example.com
のように指定します。
環境変数
よくあることですが、cron
では~/.bashrc
や~/.bash_profile
などで初期化しません。
そのため、環境変数を設定したいなら、cronのジョブとして、source <fullpath>/.bashrc; <command>
を指定するか、crontab
ファイルにkey=value
の形式で直に書いておく必要があります。
またsource
するときは、~
が設定されてないと思うので多分使えません。絶対パスで指定しましょう。
タイムゾーン
cron
ジョブはシステムの時刻で行われます。システムのタイムゾーンを変更すればcron
ジョブの実行時刻も変更したタイムゾーンで利用できます。
さらに、cron
ジョブ内でシステムのタイムゾーンを使うために、crontab
ファイル内の環境変数でTZ=UTC
などの指定が必要なようです。
自分ではあまり使ってみてないので、詳しくはこちらを参照してください:
Dockerで運用(2022/12追記)
Dockerでcronを動かす場合は以下に書いておいた:
更新していく
試したことがあれば更新していきたいです。ひとまず以上です。
コメント