systemdのtimerで定期実行しよう!
きっかけ
- 古いサーバを解約してAWSに集約した後で定期実行について調べた時にcrondがプリインストールされていなかった
- 非推奨というわけではなかったがsystemdのtimerを推奨しているようだったので、内容を調べた備忘録を記載する
Systemdのtimerってなに?
- systemdの元で動く、定期実行する仕組み
- systemdはLinuxのほぼすべてのディストリビューションに含まれるようになった
- cronと同様に設定ファイルを置くことで定期実行を行ってくれる
設定方法
※ 以下の設定はAmazon Linux 2023を用いて実施している
- ec2-userで朝6時にPythonのスクリプトを実行する例を記載します
設定ファイルの作成
/etc/systemd/system
にxxx.service
とxxx.timer
を作成します
xxx.serivceとxxx.timerのxxxの部分は同じ名前にしましょう
sample.service
[Unit]
Description=Run sample.py script as ec2-user
[Service]
Type=oneshot
User=ec2-user
ExecStart=/usr/bin/python /home/ec2-user/source/sample.py
[Install]
WantedBy=multi-user.target
それぞれの設定値について
名前 | 説明 |
---|---|
Description | そのユニットが何をするものなのか記載するところ |
Type | サービスの実行タイプ oneshotは一度だけ実行するタスクに適している。 その他のオプションについては別途まとめます |
User | どのユーザで実行するか選択する |
ExecStart | このtimerで何を実行するのか絶対パスで記述 |
WantedBy | 手動での起動が前提の場合は不要です。 APIなどネットワークに接続する必要があるときは書いたほうが無難でしょう |
sample.timer
[Unit]
Description=Timer for sample.py Script
[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true
[Install]
WantedBy=timers.target
名前 | 説明 |
---|---|
Description | そのユニットが何をするものなのか記載するところ |
OnCalendar | 実行するタイミングを記載します。 詳しい記載内容は別途 |
Persistent | 指定したタイミングで実行されなかった場合に、システム再起動後に時間外でも動かす必要がある場合Trueに設定します。 |
WantedBy | cronの代用として使うため記述します。 時間になったら動くようにするために必要な設定です。 |
設定の有効化
- サービス自動起動有効
sudo systemctl enable sample.timer
- サービスの起動
sudo systemctl start sample.timer
起動確認
- 再起動後など、自動起動されることを確認
sudo systemctl is-enabled sample.timer
- ステータスの確認
sudo systemctl status sample.timer
- タイマー設定の一覧で確認
sudo systemctl list-timers
ここまで確認すれば安心ですね👍
次回予告
明日の記事は.serviceや.timerの中身について詳しく書いていこうと思います!
参考文献