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を動かす場合は以下に書いておいた:

更新していく
試したことがあれば更新していきたいです。ひとまず以上です。



コメント