Cronジョブよりも断然おすすめ!処理の定期実行は「systemd.timer」


アイキャッチ画像

覚え書きです…
とある処理を定期実行したいならほぼ100%cron使えと言われますがcronだとどうしてもうまく行かない場合ありますよね。
composerやnpmなどのパッケージマネージャーを使うときによく起こりがちです。
以下のような注意をしないといけなかったり、、、

  • cronを使う際、PHPでオートローディングをするときにrequire_onceで読み込むとエラーが起きるからrequireincludeで読み込ませないといけない。
  • 読み込むファイルのパスを相対パスじゃなくて絶対パス(フルパス)にしないといけない。

…みたいな配慮をしないといけないしphp /hoge.phpじゃ動かない。/usr/bin/php /hoge.phpのようにしないといけない。

いろいおrめんどくさいですしそれをしても動かないこともあります。
そんな時はもういっそcornを捨ててSystemdのタイマー機能を使いっましょう。

systemdとは

systemdはlinuxにおけるサービス管理の仕組みです。Apache2を起動するにはsystemctl start apache2でやリますよね。
そういったノリでやります…

作成

service登録

ここでは/hoge.shというシェルスクリプトを一定期間実行するシステムを作ります。
因みにシェルスクリプトではphpを実行しています。

cd /
/usr/bin/php hoge.php

まずvi /lib/systemd/system/hoge.serviceでserviceファイルを作ります。
中身をこんな感じにします。

[Unit]
Description = hoge service

[Service]
Type = oneshot
ExecStart = bash /hoge.sh

これでサービス登録は終わりです。
ターミナルで以下のように入力して実行できたらおkです。(Apacheを起動する感じでね。)

systemctl start koge.service

実行の確認をする時はまたもやApacheと同じようにsatatusコマンドで見られます。

systemctl status hoge.service

timer登録

次にメインのタイマー登録をします。
さっきと似たような感じでvi /lib/systemd/system/hoge.timerファイルを作ります。

hoge.timer
[Unit]
Description = hoge timer

[Timer]
OnUnitActiveSec=10m

[Install]
WantedBy=timers.target

上記に設定だと10分おきに実行します。

実行

実行をスケジューリングする際は

systemctl start hoge.timer

で完了です。
ちゃんと動いてるかはstutusコマンドでわかります。

● hoge.timer - hikakin timer
     Loaded: loaded (/lib/systemd/system/hoge.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Sun 2021-04-04 14:19:35 JST; 1h 43min ago
    Trigger: Sun 2021-04-04 16:13:32 JST; 10min left
   Triggers: ● hoge.service

 4月 04 14:19:35 118-27-8-55 systemd[1]: Started hikakin timer.

おまけ

timerファイルを編集した場合、systemctl daemon-reloadで一旦再読み込みをさせる必要があります。

systemdを使うと絶対パスでinclude…みたいな事考えなくていいのでお勧めです。
ぜひご参考に…