今回は、CentOS 7上で自分で作ったプログラムをサービスとして登録する方法について説明します。
CentOS 6までとは管理の方法が異なっているため、ご注意ください。
環境はCentOS 7です。
今回のお題は
独自に作成した常駐プログラムをサービスとして登録します。
仮に、dummyというプログラムをサービスとして登録します。
dummyプログラムは単体で動作する時、常に動作状態を維持し障害や何らかの人為的操作以外で停止することが無いプログラムであると仮定します。
なんか難しく書きましたが、要は異常がない限り動き続けるプログラムを準備します。
それをサービスとして登録します。
サービス登録内容の記述
サービス登録を行うためには、設定内容をファイルに記述する必要があります。
そのファイルは以下のフォルダーへ保存します。
1 |
/etc/systemd/system |
試しにdummyプログラムをサービスとして登録する場合の記述内容を以下に記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[Unit] Description = Dummy TCP daemon [Service] Restart = always StartLimitInterval=60 StartLimitBurst=5 PIDFile=/var/run/dummy/dummy.pid ExecStart = /root/work/nsaito/testcode/dummy -D ExecStop=/usr/bin/kill -p $MAINPID [Install] WantedBy=multi-user.target |
[Unit]ではこのサービスに関する説明を記しています。
Descriptionで簡単な名前を登録します。
[Service]では、以下の内容を登録しています。
Restart:always・・・サービスが停止していた場合に自動的に再起動を行います。
StartLimitInterval=60・・・①
StartLimitBurst=5・・・・・②
StartLimitInterval中にStartLimitBurst回の再起動を試みますが、それが失敗した場合には、次のStartLimitInterva時間は再起動を試みません。という設定になります。
PIDFileはPIDを出力する先を示しています。
ExecStartはコマンドの起動方法です。
ExecStopはコマンドの終了方法です。
[Install]
WanterByでは、OSの起動のセッションを指定しています。
multi-user.targetはinit 3の起動時に相当します。
他にgraphical-user.targetなどを指定することが可能です。
multi-user.targetを指定した場合、graphical-user.target時にも起動されます。これは、graphical-user.targetがmulti-user.targeをベースにしているためです
上記の設定では、プロセスが起動できない状態が発生した場合、永遠に再起動が繰り返されることになります。
また、プロセスがゴースト(defunct)になってしまった場合に、プロセス自体が残るため再起動が行われない可能性が残ります。
そういう意味では、少し問題を抱えていると思っても良いでしょう。
この解決方法については、別途説明したいと思います。
サービスの起動と終了
サービスを起動するには、通常通り以下のコマンドでサービスを起動します。
1 2 3 4 5 6 7 8 9 10 11 |
# systemctl start dummy [root@localhost system]# systemctl status dummy ● dummy.service - Dummy TCP daemon Loaded: loaded (/etc/systemd/system/dummy.service; disabled; vendor preset: disabled) Active: active (running) since 火 2018-02-06 14:01:54 JST; 2s ago Main PID: 17011 (dummy) CGroup: /system.slice/dummy.service mq17011 /root/work/nsaito/testcode/dummy -D 2月 06 14:01:54 localhost.localdomain systemd[1]: Started Dummy TCP daemon. 2月 06 14:01:54 localhost.localdomain systemd[1]: Starting Dummy TCP daemon... |
終了させるには、以下のコマンドです。
1 |
# systemctl stop dummy |
startもstopも基本的に何もエコーバックされてこないのでstatusで確認を取るのが賢明でしょう。
startさせた後に、OS起動時の登録を行う場合には以下のコマンドを実行してください。
1 |
# systemctl enable dummy |
disableすれば起動時の登録は解除されます。
課題
Systemdで登録したサービスの再起動には、先に述べた通り、プロセスがゴースト化してしまったり、何らかの異常が発生して実際の動作を行っていない場合の対処法がありません。
そんな時には、サービスとしての登録だけは行い、monitなどのプロセス監視を併用すると良いかと思います。
次回は、このDummyサービスをmonitを併用したプロセスの自動再起動をやってみようと思います。