経緯
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
の設定を無効化して完了。