【Linux】systemd で独自サービスを立ち上げる

■ はじめに

* Hello World的なものを作成し、デプロイ/実行する
   => 仕組み自体はとってもシンプルで簡単にできる

目次

【1】systemdでのサービス作成について
【2】動作環境
【3】サンプル
【4】デプロイ
【5】トラブルシュート方法
【6】 設定ファイル構文
 1)Unit・Before/After
 2)Service・Type
 3)Service・KillMode

【1】systemdでのサービス作成について

ざっくりいってしまうと...

 * 『「xxx.service」ファイルを作成し、 /etc/systemd/system 配下に置く』だけ

【2】動作環境

 * OS : Debian7 (別にCentOSなど他でもできるかと)

【3】サンプル

sample.sh

#!/bin/bash
while true
do
   NOW=`date +%Y%m%d-%H%M%S`
   echo "Hello World!! ... ${NOW}" >> /tmp/sample.log
   sleep 3
done

sample.service

[Unit]
Description = Sample Service!!

[Service]
ExecStart=/home/user/sample.sh
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target

【4】デプロイ

# シェルに実行権限を付与
sudo chmod u+x ~/sample.sh

# serviceを配置
sudo cp sample.service /etc/systemd/system/.

【4】実行する

sudo systemctl daemon-reload

sudo systemctl start sample.service

# サービスの確認 
sudo systemctl list-unit-files --type=service | grep sample

実行結果例

# 「tailf /tmp/sample.log」で確認

Hello World!! ... 20170730-093727
Hello World!! ... 20170730-093730
Hello World!! ... 20170730-093733
Hello World!! ... 20170730-093736

【5】トラブルシュート方法

# エラーになった場合、以下を実行し、糸口をつかむ

journalctl -xe

sudo systemctl status 【サービス名(ex. sample.service)】

# サービスの確認 
sudo systemctl list-unit-files --type=service | grep 【サービス名(ex. sample)】

【6】 設定ファイル構文

*  以下が分かりやすい

http://qiita.com/a_yasui/items/f2d8b57aa616e523ede4
http://qiita.com/masami256/items/ef0f23125cf8255e4857

1)Unit・Before/After

After=A B ...: 自分自身は、Unit「A」「B」...の後に起動
Before=A B ...: 自分自身は、Unit「A」「B」...の前に起動

サンプル

[Unit]
Description=xxxx
After=syslog.target network.target <= ★自分自身は、Unit「システムログ」「ネットワーク環境」の後に起動する★

2)Service・Type

 * サービスプロセスの起動完了の判定方法(以下は代表的な値)
 * その他のタイプは、以下のサイトを参照のこと。

https://wiki.archlinux.jp/index.php/Systemd#.E3.82.BF.E3.82.A4.E3.83.97

意味 備考
Type=simple 残プロセスは放置 -
Type=forking 最初のコマンドが終了したタイミングを起動完了と判断 -
Type=oneshot コマンドが終了したら起動完了と判定して、サービスも終了したものと認識 ★重要★「RemainAfterExit=yes(コマンドの実行終了後もステータスをアクティブにしておきたい時に使う)」を設定する

3)Service・KillMode

* ExecStopコマンドで停止時、残プロセス処理を設定する
意味 備考
KillMode=none コマンド実行後、即起動完了 デフォルト
KillMode=process メインプロセスが残っている場合、SIGTERM/SIGKILLで停止。その他の残プロセスは放置 -
KillMode=control-group グループ内の全ての残プロセスを SIGTERM/SIGKILL で停止 -

参考文献

http://qiita.com/yosi-q/items/55d6d3d6834c778ae2ea
http://qiita.com/nownabe/items/ca45bb4829d75460b31e

関連記事

サービス管理 ~ service/systemctl ~
https://dk521123.hatenablog.com/entry/2016/07/26/223003