でんげき☆ Network Service

Raspberry Pi 4 で運用実験中 Connect checker

No.12

スケジュール実行 cron は 13 日の金曜日の夢を見るか?

20211211080738-admin.png
 
「〇〇〇〇は△△△△の夢を見るか?」ってフレーズを見かけるとなんかえっちな気分になっちゃう!って光栄マイコンシステムのストロベリーなんとか世代のひいおじいちゃんが云ってたけど…自称:ゆとりのない平成のゆとり的なオレ様的にはしょーみなンてるんか全く意味わかんないですw まじまじwww
まぁそんな茶番はおいといて…諸々の bot 大好きな人々に愛されるスケジュール実行の cron についての諸々です

cron - daemon to execute scheduled commands (Vixie Cron)
スケジュールされたコマンドを実行するデーモンって事らしいですね(機械翻訳

このスケジュールの確認・設定をするには crontab なるコマンドを使います
スケジュールの確認 crontab -l
スケジュールの設定 crontab -e

設定の初回起動時のみ使用するエディタを聞かれるらしい? なおこの使用するエディタは以下のコマンドで再設定できるようです
select-editor

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]:

なんか「<---- easiest」と「[2]」ってのが現在設定されているエディタっぽく見えるけどそうじゃなくて…何も入力せずに Enter した時に選択されるデフォルト値を表示しているようです 紛らわしいですね(-_-;)

  :

では実際に crontab -e して設定してみましょう
新たなスケジュールを設定する場合は…新しい行として以下の書式を追加します

* * * * * コマンド

5 個並んだ「*」は順番に… 分 時 日 月 曜日 を指しています
「*」は設定可能な全ての値になってるんで…上記の「* * * * * コマンド」は 全ての分全ての時全ての日全ての月全ての曜日 って意味となり「毎分(だいたい 0 秒くらい)にコマンドを実行」となります
もうちょっと細かく設定した例っていうか…

1 * * * * コマンド
毎月の毎日の毎時の 1 分にコマンドを実行

1 2 * * * コマンド
毎月の毎日の 2 時 1 分にコマンドを実行

1 2 3 * * コマンド
毎月の 3 日の 2 時 1 分にコマンドを実行

1 2 3 4 * コマンド
4 月 3 日の 2 時 1 分にコマンドを実行

曜日は少々特殊な扱いになってるってるんでアレだけど…例えば
* * * * 6 コマンド もしくは
* * * * sat コマンド で毎月の毎土曜日の毎時の毎分にコマンドを実行します
数字と曜日は 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun に対応しています 大文字小文字は関係ないようです

  :

もっと細やかな設定をしてみましょう 例えば勤務時間内にありがちな設定っていうか 8 時から 17 時までの毎時 0 分にコマンドを実行するって例だと…
0 8,9,10,11,12,13,14,15,16,17 * * * コマンド
0 8-17 * * * コマンド
設定したい内容を「,(カンマ)」で区切って列挙するとか「-(ハイフン)」で 8 から 17 までって感じで指定します
0 8-12,13-17 * * * コマンド
こんな感じで範囲指定を列挙することもできるようです

ただし分なり時なりの境い目をまたいで設定する場合には注意が必要です 例えば毎時の 50 分から次の 10 分までって場合だと…
50-10 * * * * コマンド
この指定では動きません この場合だと…
50-59,0-10 * * * * コマンド
こんな感じで途中に「,(カンマ)」を入れて区切ってやらないとダメなようです ちなみに「,(カンマ)」で列挙する場合には数の大小の順番は関係ないらしいです

  :

さらに細やかな設定をしてみましょう 例えば(どのような状況でそのような必要があるのかイマイチ思い浮かばないけど)偶数日(2 で割り切れる日)の 10 時 20 分のみコマンドを実行するって例だと…
20 10 2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * コマンド
20 10 2-30/2 * * コマンド
こんな感じで指定できます まぁ「全ての偶数日」って事なんで「2-30/2」なんて指定じゃなく「*/2」でもイケるようです
ちなみに「全ての奇数日」ってしたいのあれば「1-31/2」って感じになるみたいです
  :

月初にコマンドを実行したい時っていうか月初は 1 日に決まってるんでその辺は簡単だってことで…じゃぁ月末にコマンドを実行したい時はどうしたらいいんでしょうか
カレンダーをざっと眺めて 12 ヶ月分の設定を用意しとけば…って「あーでも 2 月の月末は 28 日だけじゃなくてうるう年とかどうしよう!!」ってなるんでもうちょっと手の込んだ設定でどうにかしてみましょう
この場合っていうか cron の設定だけでは毎月の月末を判定することはできません なのでコマンド側でその辺をどうにか対処してみます

* * 28-31 * * /usr/bin/test $(/bin/date -d '+1 day' +%d) -eq 1 && コマンド
いきなりややこしい感じになって申し訳ないかんじで(汗
これは月末としてなり得る 28 日 から 31 日にかけて /bin/date に「翌日」を出力させた後に /usr/bin/test でそれが「月初」を意味する「1」であるかを判定して「1」であれば && でくっつけたコマンドを実行するって意味になります

cron 内での使用に限った話じゃないけど…この && でコマンドを並べると「直前のコマンドが正常終了した場合に次のコマンドを実行」って動作をします 例えば Web サイトの証明書の更新コマンドを実行して…それが成功して更新コマンドが正常終了した時のみ Web サーバを再起動するなんて処理を 1 行にまとめて書けるんで便利だと思います

  :

そんな感じの複雑な判定を求められるスケジュール設定っていうか…少し特別動作をする「曜日」の設定についての注意事項を少々
例えば「13 日の金曜日の 0 時 0 分にコマンドを実行」なんてありがちなスケジュール設定をしたいと思いました
0 0 13 * fri コマンド
これでバッチリだぜ!!(>_<)wって思いたい所ですが…これでは思った動作をしません
これだと「毎月の 13 日」と「毎月の金曜日」の両方でコマンドが実行されてしまします

何となくこれまで見てきた cron の動作的に「設定した項目の全てに合致した AND 的な動作」を期待しがちなんだけど…「日の設定」と「曜日の設定」に関しては「どちらか一方でも合致したら動く OR 的な動作」になってしまうようです ※ただし「*」での設定は除く

0 0 13 * * /usr/bin/test $(/bin/date +\%w) -eq 5 && コマンド
0 0 * * fri /usr/bin/test $(/bin/date +\%d) -eq 13 && コマンド
そんな 13 日の金曜日を判定するには上記のように設定します
※ 0=sun, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri, 6=sat, 7=sun

前者は毎月の 13 日/bin/date を使って曜日を出力させてそれが金曜日かどうかを判定する手法
後者は毎月の金曜日/bin/date を使って日付を出力させてそれが 13 日かどうかを判定する手法です
後者の手法は「毎月の金曜日」って感じで月に 4〜5 回ほど動作することになって無駄が多いんで…この場合は前者の「毎月の 13 日」って設定の方が好ましいと思います

  :

あと cron の設定でミスりやすい点と云うかコマンドや入出力に使用するファイルへのパスですかね
コマンドというかスクリプトを作ってる時にありがちなんだけど…どこかのフォルダをカレントディレクトリに設定してスクリプトをテストしていて「できた!さぁ cron に設定しよう!」ってしたら思った動作をしない時があるんですよね
これは cron が実行するカレントディレクトリが往々にしてテストしていたフォルダと違う事により指定したファイルを読めない・書けないって事が原因にあるようです
なので cron で実行されるコマンド(スクリプト)はフルパスで指定して…かつ読み書きするファイルなどもフルパスで設定する必要があります うっかりしてるとやらかしがちなミスなんで注意していきタイネ!

※なお今回紹介した /usr/bin/test/bin/date のパスは我が家でのもので…環境によって違う場合があるので事前に which コマンド等で調べてから使用してください #[Raspberry Pi] #コマンドヘルプ #cron

情報 <3967文字>

DASHBOARD

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■ハッシュタグ:

■カテゴリ:

■日付検索:

■機器状態:

Raspberry Pi 4 Status

編集

RSSフィード