Cronジョブよりも断然おすすめ!処理の定期実行は「systemd.timer」
覚え書きです…
とある処理を定期実行したいならほぼ100%cron使えと言われますがcronだとどうしてもうまく行かない場合ありますよね。
composerやnpmなどのパッケージマネージャーを使うときによく起こりがちです。
以下のような注意をしないといけなかったり、、、
- cronを使う際、PHPでオートローディングをするときに
require_once
で読み込むとエラーが起きるからrequire
かinclude
で読み込ませないといけない。 - 読み込むファイルのパスを相対パスじゃなくて絶対パス(フルパス)にしないといけない。
…みたいな配慮をしないといけないし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
ファイルを作ります。
[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…みたいな事考えなくていいのでお勧めです。
ぜひご参考に…