systemd によるサービス作成

.service ファイルはUnit、Service、Installから成る。 それぞれの指定項目は以下の通り

各種役割

Unit

この項目にはこのユニットの概要について記載する。

項目説明
Descriptionユニットの説明
DocumentationユニットについてのドキュメントURI
Afterこのユニットの前に起動するユニット
Beforeこのユニットの後に起動するユニット
Requiresこのユニットが依存するユニット。前のユニットの起動が失敗したら起動しない。
Wantsこのユニットが依存するユニット。前のユニットが起動していなくても起動する。
Conflicts指定したユニットと一緒に起動しない

Service

この項目には何をするのかについて記述する。

項目説明
Typeプロセスの起動方法
simple:デフォルト。プロセスが起動した時点で起動完了
forking:フォークして親プロセスが終了した時点で起動完了
oneshot:simple と似ているが、次のユニットを実行する前に自身のプロセスを終了する
dbus:D-Bus を使うプロセスで、D-Bus の接続名を見つけると起動完了
notify:simple と似ているが、sd_notify() 関数で起動完了のメッセージを受け取ったときに起動完了
idle … simple と似ているが、他のジョブが終了するまで待機する(シェルへの出力が混ざらないようにするため)
ExecStart起動時に実行するコマンド
ExecStop停止時に実行するコマンド
ExecReloadリロード時に実行するコマンド
Restartプロセスが停止したとき、プロセス再起動の条件。各条件は以下の4つ
always:常に再起動する
no:再起動しない
on-success:終了コードが0で再起動する
on-failure:終了コードが0以外で再起動する

Install

この項目にはどのプロセスと一緒に起動するか記述する。

項目説明
Aliasenable時にここで指定された名前のユニットのシンボリックリンクを作成する
RequiredByenable時にこのユニットの.requiredディレクトリにリンクを作成する
WantedByenable時にこのユニットの.wantsディレクトリにリンクを作成する。default.targetやmulti-user.targetを指定する。
Alsoenable/disable時に同時にenable/disableするユニット

作成例

Zabbix-agent.service

[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/etc/zabbix/zabbix_agentd.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-agent
Type=forking
Restart=on-failure
PIDFile=/run/zabbix/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix

[Install]
WantedBy=multi-user.target

起動後に一度だけシェルを実行する。

以下ではconfig_network.shを起動時に実行するサービスを定義する。 /usr/lib/systemd/set_network.service というファイルを作成し、以下のように記載する。

[Unit]
Description=add secondary ip address
After=syslog.target
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/share/config_network.sh
Restart=on-failure

[Install]
WantedBy=default.target

作成したら、.service ファイルに実行権限を与えて daemon を再読み込みする。

# chmod +x /usr/lib/systemd/set_network.service
# systemctl daemon-reload