はじめに
Amazon Linux には、デフォルトでは crontab がインストールされていません。crontab を利用したい場合は、下記などを参考に、cronie パッケージをインストールする必要があります。
一方で、既定で備わっている systemd の timer 機能を利用することで、crontab と同じようにジョブのスケジュール実行が可能です。
スクリプト
実行するスクリプトを準備します。例えば、こちらにあるような 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 を作成します。
[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 を作成します。
[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 を開始して有効化します。
sudo systemctl start python.timer
sudo systemctl enable python.timer
なお、.service ファイルと .timer ファイルは、いずれも /etc/systemd/system/ ディレクトリ直下に配置する必要があるようです。サブディレクトリを作成して、その配下に unit ファイルをまとめたいとも考えたのですが、どうやらできない様子です。
登録状況の確認
下記コマンドを実行して、スケジューラーの登録状況を確認します。登録されているジョブが一覧で表示され、前回実行や次回実行のタイミングなどを確認することができます。
systemctl list-timers
実行ログを確認する場合は、journalctl コマンドを使用します。記述内容に問題がある場合には、問題個所を確認することができます。
sudo journalctl -u python
タイマー停止・無効化
スケジュール実行が不要になった場合は、タイマーを停止し、無効化します。
sudo systemctl stop python.timer
sudo systemctl disable python.timer
最後に
systemd timer を使ってジョブを登録する場合、service と timer を別々に作成し、かつ必要な unit 分これらを作成しなければいけないため、crontab と比較して、少々手間がかかるかなとも思いました。ただ、一度登録してしまえば、登録状況も一覧で確認出来ます。要は慣れですね。
Yellowfin が参照するデータを最新化するためには、夜間バッチなどで情報を更新する必要があります。Linux でジョブをスケジュール実行する時には、是非 systemd timer の利用をご検討ください。
では皆様、良いデータ分析を!
参考情報