Skip to content

Amazon Linux 2023 で (cron では無く) systemd を使って venv 環境の Python を定期実行する

「Linux で定期的にジョブを実行する」場合、cron が広く使われていました。 しかし昨今の Linux には cron が同梱されないものも増えつつあり、Amazon Linux 2023 も公式ドキュメントである AL2023 では非推奨 にも記載されている通り、今後は (cron では無く) Systemd Timer を利用することが推奨されています。 今回は Amazon Linux 2023 で Systemd Timer を使って定期ジョブを設定する方法をメモしておきます。

事前に Amazon Linux 2023 へ asdf / direnv / uv をインストールして Python 環境を構築する の手順に従って環境構築されており、実行したいジョブは「Python の仮想環境内に存在する」という前提です。

検証環境

Amazon Linux 2023 は ARM 版の t4g.micro インストールを利用しました。

対象 バージョン
Amazon Linux 2023.6.20241031

Systemd 用ユニットファイルの用意

Systemd 用に「タイマー」と「サービス」の定義ファイルを用意します。

/etc/systemd/system/sample.timer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=Sample Timer

[Timer]
OnCalendar=*-*-* *:00/10:00
Persistent=true
AccuracySec=1m

[Install]
WantedBy=timers.target

/etc/systemd/system/sample.service

/opt/sample は Python の venv で作成された仮想環境です。 このディレクトリを WorkingDirectory として指定することで direnv で自動的に仮想環境が Activate されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Sample

[Service]
Type=oneshot
User=root
ExecStart=/opt/sample/.venv/bin/python3 sample.py
WorkingDirectory=/opt/sample

[Install]
WantedBy=multi-user.target

タイマーの開始

ユニットファイルを追加した為、systemctl daemon-reload を実行してファイル追加を認識させます。

systemctl daemon-reload

タイマーを開始します。

systemctl start  sample.timer
systemctl enable sample.timer

動作ログは journalctl -u sample.timer を確認します。 また「スケジューリング状況」(次、いつ実行されるのか?) を確認したい場合は systemctl list-timers を実行します。