用語
cronとは
Unix系のオペレーティングシステムで使用されるタスクスケジューラーのことです。特定の日時や間隔で自動的にコマンドやスクリプトを実行するための仕組みです。例えば、毎日決まった時間にバックアップを取ったり、毎週特定の曜日にデータを更新したりすることができます。設定は「crontab」というファイルで行い、そこに実行したいコマンドやスケジュールを記述します。
Windowsで言うとタスクスケジューラがそれに該当します。

AWSで言うとEventBridge(Scheduler)
AzureでいうとAzure Functionsのスケジュール機能が近そう。
crontabとは
cronで実行するタスクのスケジュールを設定するためのファイルやコマンドのことです。このファイルには、どのコマンド・スクリプトをいつ実行するかを指定するルールが書かれています。
このファイルはcrontab -eというコマンドで編集することが出来ます。また、現在の設定はcrontab -lで確認することが出来ます。
atとは
cronとは異なり、一度限りのタスクを指定した時間に実行するためのコマンドです。
(個人的に、ではありますが案件で使ったことないですね・・・)
タスク管理/スケジュール管理ツール
JP1やHinemos等のツールがあります。
これらのツールを使う事で各サーバ個別でcrontab -eでジョブをスケジューリング・管理して。。。という事を無くし、JP1サーバ・Hinemosサーバ上で一元管理することが可能になります。使っている案件はちょこちょこ見るので覚えておくと良いと思います。触ってみたいようであればHinemosは無料で作ることも可能なので、こちらがおすすめです。
cronを触ってみる
まずはGUI(crontab-ui)
crontab-uiというツールを導入します。
これはNode.jsをインストールする必要があります。
root@test-Standard-PC-i440FX-PIIX-1996:~# apt update && apt upgrade -y
root@test-Standard-PC-i440FX-PIIX-1996:~# apt install nodejs npm -y
root@test-Standard-PC-i440FX-PIIX-1996:~# npm install -g crontab-ui
crontab-uiコマンドで起動することが出来ます。
URIが発行されるのでWebブラウザを開いて、これにアクセスします。
root@test-Standard-PC-i440FX-PIIX-1996:~# crontab-ui
Cron db path: /usr/local/lib/node_modules/crontab-ui/crontabs
Node version: 18.19.1
Crontab UI (0.4.2) is running at http://127.0.0.1:8000
ジョブスケジュールを新規作成してみます。
Newボタンを押下します。
その後以下の設定を入力してみます。
Name:Check-Alive
Command:date >> /home/test/Check-Alive-crontab-ui.log
Schedule:MinuteからWeekまですべて*
この状態でSaveを押下します。
Minute Hour Day Month Weekはそれぞれ分、時、日、月、曜日を示します。

1行追加されました。
この状態でSave to crontabを押下します。

Save出来ました。
Nameの右側に緑色のチェックマークがついていることを確認します。

5分ほど待ってみます。
homeディレクトリ配下にCheck-Alive-crontab-ui.logが作成されていることがわかると思います。

中身を見てみると毎分dateコマンドが実行され、それがログに記載されていることがわかると思います。

terminalでcrontab -lコマンドを実行するとWebUIで作成したジョブが表示されていることが見れると思います。

例えばこれを2分に1回としてみたいと思います。
*/2として、Setボタンを押下。Saveを押します。

数分待った後、Check-Alive-crontab-ui.logを見てみます。
毎分ログに記録されていたと思いますが、これが2分に1回のペースで記載されるようになりました。

CUIで操作してみる
terminalを開いてcrontab -eコマンドを実行します。

crontabをどのエディターで編集するかを選べるようです。
1(nanoコマンド)で編集していきたいと思います。
これはDebian系のOSで初めて実行するタイミングで聞かれるようです。

1行目に先ほどGUIで設定したジョブが記載されているので、2行目に以下のジョブを設定します。
10,20,30日の午前8時ちょうどに上記のcronテストで作成したlogを削除するという内容です。
0 8 10,20,30 * * rm -f /home/test/Check-Alive-crontab-ui.log
crontab -lで確認してみます。
登録されていることがわかります。

crontabで気を付けること
Day(日)とWeek(曜日)の両方の設定を入れると、そこだけはor条件(どちらかが満たされるときに実行される)になります。
例えば先ほどcrontab -eで入力したスケジュールが以下だったとします。
0 8 10,20,30 * mon,fri rm -f /home/test/Check-Alive-crontab-ui.log
この場合、「10日・20日・30日」のいずれか、または「月曜日・金曜日」のいずれかに該当する日の、午前8時00分にコマンドが実行されます。
【例】
- 10日(火曜日)→ 実行される(「日」の条件に一致)
- 13日(金曜日)→ 実行される(「曜日」の条件に一致)
- 20日(金曜日)→ 実行される(両方の条件に一致)
もし「10, 20, 30日のうち、月曜か金曜の時だけ」に限定したい場合は、コマンド側で判定を行う必要があります。コマンドを使って無理やり設定する感じになります。
0 8 10,20,30 * * [ "$(date +\%w)" -eq 1 ] || [ "$(date +\%w)" -eq 5 ] && rm -f /home/test/Check-Alive-crontab-ui.log
AWSのEventBridgeも似たような制限があります。
具体的にはDayかWeekだけ設定できて、例えばDayを設定した場合はWeekの方は"?"にしないといけません。逆も同様でWeekの設定をしているのであれば、Dayの設定は"?"としなければエラーとなり設定できません。
Hinemos等のJob管理ツールを使うとこの辺りも柔軟に対応することが出来ます。
例えば第4金曜日とか。ですね。




