(RedHat系 + PHP) 自作の PHPスクリプト をサービス化する

経緯

Red Hat 系 Linux OS で自作の PHPスクリプト をサービスとして常時起動したくなったので、その際の設定方法をメモしておきます。

失敗した方法

# vi /etc/crontab

@reboot root php /path/to/directory/argos.php

当初は「リブートの度に cron で PHP が該当スクリプトをキックする」という単純な想定をしていましたが、どうも上手く動かなさそうなのでサービス化することにしました。

対処

先述した通り、 cron では上手く行かなかったのでサービス化する方針で設定を追加します。設定前に cron から起動していたプロセスは kill -9 で切っておきます。

# vi /etc/systemd/system/argos.service

[Unit]
Description=This is a monitoring system for some servers environment.

[Service]
ExecStart=/usr/bin/php /path/to/directory/argos.php
After=network.target
Restart=Always

[Install]
WantedBy=multi-user.target

まずは /etc/systemd/system/ の下に {サービス名}.service というファイルを作成し、上記のような内容で保存します。

# systemctl enable argos.service
Created symlink /etc/systemd/system/multi-user.target.wants/argos.service → /etc/systemd/system/argos.service.

systemctl に登録します。

# service argos.service start

起動。

# service argos.service status
Redirecting to /bin/systemctl status argos.service
● argos.service - This is a monitoring system for some servers environment.>
   Loaded: loaded (/etc/systemd/system/argos.service; enabled; vendor preset: d>
   Active: active (running) since WWW yyyy-MM-dd hh:ii:ss JST; 11s ago
 Main PID: xxxxx (php)
    Tasks: 1 (limit: yyyyy)
   Memory: 11.2M
   CGroup: /system.slice/argos.service
           mqxxxxx /usr/bin/php /path/to/directory/argos.php

MM月 dd hh:ii:ss somethingserver.example.jp systemd[1]: Started This is a monitorin>

状態確認。稼働していることが確認できます。

# ps -aux | grep "argos"
root     xxxxx  0.0  0.3 aaaaaa bbbbb ?        Ss   hh:ii   0:00 /usr/bin/php /path/to/directory/argos.php
root     zzzzz  0.0  0.0  ccccc  ddddd pts/0    S+   hh:ii   0:00 grep --color=auto argos

# lsof -i:3102
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
php     xxxxx root    3u  IPv4 eeeeeee      0t0  UDP somethingserver.example.jp:3102

今回は UDP/3102 で待ち構えていてほしいので losf を使用してポート開放状況も確認します。開いていますね。

# journalctl -u argos.service -f
-- Logs begin at WWW yyyy-MM-dd hh:ii:ss JST. --
MM月 dd hh:ii:ss somethingserver.example.jp systemd[1]: /etc/systemd/system/argos.service:6: Unknown lvalue 'After' in section 'Service'
MM月 dd hh:ii:ss somethingserver.example.jp systemd[1]: /etc/systemd/system/argos.service:7: Failed to parse service restart specifier, ignoring: Always
MM月 dd hh:ii:ss somethingserver.example.jp systemd[1]: Started This is a monitoring system for some servers environment.

ジャーナルを見ても起動していることが確認できます。

# vi /etc/crontab

#@reboot root php /path/to/directory/argos.php

最後に、当初の cron の設定を無効化して完了。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。