shellとかコマンドとかをサービス化(デーモン化)するやつ


shellとかコマンドとかをサービス化するやつ

これも忘れがちだからメモ
この記事は必要に応じて調べながら修正していく。

やり方

sudoして/etc/systemd/system/にサービス名.serviceを作る。
各セクションの説明はsystemd サービスユニット覚書のほうが詳しく載ってる。

Unit

サービスの説明

項目 説明
Description 説明
After 前提サービス
Before このサービスより前に起動するべきサービス

Servise

サービス自体の設定

項目 説明
ExecStart 実行コマンド
Restart Restartオプション
Type サービスタイプ

Install

サービスのenable/disableに対するオプション

オプション 説明
WantedBy enable時にこのUnitの.wantsディレクトリにリンクを作成する
RequiredBy enable時にこのUnitの.requiredディレクトリにリンクを作成する
Also enable/disable時に同時にenable/disableするUnit
Alias enable時にこのUnitの別名を用意

参考:http://enakai00.hatenablog.com/entry/20130917/1379374797

とりあえず適当に使いたいときはExecStartらへんをちゃんとしておけばok

[Unit]
Description = example
After=network-online.target
ConditionPathExists=/home/user/script

[Service]
ExecStart=/home/user/script/ping.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

Restartについて

結構細かい設定が可能。

オプション 説明
no プロセスが終了してもプロセスを再起動しません。
on-success プロセスが正常終了したときにプロセスを再起動します。ただし正常終了とは終了コードが 0 のときや SIGHUP, SIGINT, SIGTERM, SIGPIPE のシグナルで終了した場合のことです。
on-failure プロセスが異常終了したときにプロセスを再起動します。ただし異常終了とは終了コードが 0 以外のときやコアダンプなどの上記4つ以外のシグナルで終了した場合などのことです。
on-abnormal on-failure と似ていますが、終了コードによるプロセスの再起動はしません。
on-abort プロセスが上記4つ以外のシグナルで終了したときにプロセスを再起動します。
on-watchdog watchdogがタイムアウトしたときにプロセスを再起動します。

参考:systemctlでプロセス自動再起動

有効化

$ sudo nano /etc/systemd/system/ping.service
$ sudo chown root:root /etc/systemd/system/ping.service
$ sudo chmod 644 /etc/systemd/system/ping.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable ping.service
$ sudo systemctl start ping.service