0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

systemd timer

Last updated at Posted at 2024-08-07

はじめに

Amazon Linux には、デフォルトでは crontab がインストールされていません。crontab を利用したい場合は、下記などを参考に、cronie パッケージをインストールする必要があります。

一方で、既定で備わっている systemd の timer 機能を利用することで、crontab と同じようにジョブのスケジュール実行が可能です。

スクリプト

実行するスクリプトを準備します。例えば、こちらにあるような Python プログラムを起動するシェルを以下のように記述します。

python 起動
#! /usr/bin/python

python /usr/local/python/Redshift.py

この時重要なのが、プログラム内のパスを全て絶対パスで指定することです。私の場合、Python プログラムの中で一つでも相対パスの指定があると、systemd timer がファイルの位置を認識できず、エラーで処理が終了していました。

作成したスクリプトを /usr/local/sh/python.sh に保存します。

サービス

スケジュール実行を登録する場合、.service ファイルと .timer ファイルを作成します。.service に実行するジョブの内容を、.timer にジョブの実行タイミングに関する内容を定義します。両ファイルが unit となって動作します。

まずは、/etc/systemd/system/python.service を作成します。

python.service
[Unit]
Description=”Executing python program”

[Service]
Type=simple
User=testuser
ExecStart=/usr/bin/bash /usr/local/sh/python.sh

[Install]
WantedBy=multi-user.target

各項目での設定内容は以下の通りです。

項目 説明
Description サービスファイルの内容を任意で記述
Type 起動完了の判断。デフォルトは Simple で、実行時に起動完了の判定
User 実行ユーザーの指定
ExecStart 実行するスクリプト
WantedBy enable 時にこの unit の .wants ディレクトリにシンボリックリンクを作成

作成したサービスを有効化します。

サービス有効化
sudo systemctl enable python

タイマー

/etc/systemd/system/python.timer を作成します。

python.timer
[Unit]
Description=”Executing python program”

[Timer]
OnCalendar=*-*-* 01:30:00
Unit=python.service

[Install]
WantedBy=multi-user.target
項目 説明
OnCalendar 実行のタイミング
Unit 先に作成した service ファイルを指定

上記例では、毎日午前 1 時 30 分にジョブが実行されます。
様々なタイミングで実行が可能です。OnCalendar に定義する内容に関しては、下記サイトに記述例も含めとても分かりやすく説明されているので、是非参考にしてみてください。

作成した timer を開始して有効化します。

enable timer
sudo systemctl start python.timer
sudo systemctl enable python.timer

なお、.service ファイルと .timer ファイルは、いずれも /etc/systemd/system/ ディレクトリ直下に配置する必要があるようです。サブディレクトリを作成して、その配下に unit ファイルをまとめたいとも考えたのですが、どうやらできない様子です。

登録状況の確認

下記コマンドを実行して、スケジューラーの登録状況を確認します。登録されているジョブが一覧で表示され、前回実行や次回実行のタイミングなどを確認することができます。

list-timers
systemctl list-timers

実行ログを確認する場合は、journalctl コマンドを使用します。記述内容に問題がある場合には、問題個所を確認することができます。

list-timers
sudo journalctl -u python

タイマー停止・無効化

スケジュール実行が不要になった場合は、タイマーを停止し、無効化します。

python
sudo systemctl stop python.timer
sudo systemctl disable python.timer

最後に

systemd timer を使ってジョブを登録する場合、service と timer を別々に作成し、かつ必要な unit 分これらを作成しなければいけないため、crontab と比較して、少々手間がかかるかなとも思いました。ただ、一度登録してしまえば、登録状況も一覧で確認出来ます。要は慣れですね。
Yellowfin が参照するデータを最新化するためには、夜間バッチなどで情報を更新する必要があります。Linux でジョブをスケジュール実行する時には、是非 systemd timer の利用をご検討ください。

では皆様、良いデータ分析を!

参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?