crontabのメモ

crontabでのあれこれ

基本はmanを見る

ここを見ると大抵のことは解決できると思います。

Man page of CRONTAB

上のページを見て、この場合はどうなるんだろう、といったケースを試していきます。

また、日時指定については、以下のサイトが便利だと思いました:

Cron expression generator by Cronhub
Cron expression generator by Cronhub

*/3 * * * *など打ち込んだ場合にどういうタイミングで実行するか教えてくれます。

実験方法

こちらは忘れそうなので、ここに記しておきます。cronのログを見られるようにするまでが大変でした。

dockerを利用して試します。

  • docker run --name <NAME> -d --log-driver json-file alpine crond -f -l 0crondをフォアグラウンドで作動
  • docker exec -it <NAME> shでコンテナにアタッチ
    • アタッチしたら、crontab -eで編集
    • 内容は、試したいことを書いておく
    • 保存して終了
  • exitしてデタッチ

1番目のコマンドの説明からいきます。

--name指定は、execでのアタッチで指定しやすくするためにあります。 -dのデタッチ指定は後でアタッチするためにあります。 --log-driver json-file指定はcronの結果を見るために指定しています。docker logs <NAME>で結果を見ることができます。

イメージは軽量なalpineを使います。crond -f -l 0crondをフォアグラウンドで動作させ、ログ出力も多めにしています。

続いて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などの指定が必要なようです。

自分ではあまり使ってみてないので、詳しくはこちらを参照してください:

How do you set the timezone for crontab?
I have set up ACPI wakeup so my laptop wakes up at a certain time each morning. The timezone for this is UTC. I want to set up my crontabs also using UTC so the...

更新していく

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

タイトルとURLをコピーしました