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

はじめに

 * Hello World的なものを作成し、デプロイ/実行する

   => 仕組み自体はとってもシンプルで簡単にできる

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

ざっくりいってしまうと...
 * 『「xxx.service」ファイルを作成し、 /etc/systemd/system 配下に置く』だけ

■ 動作環境

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

■ サンプル

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

■ デプロイ

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

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

■ 実行する

sudo systemctl daemon-reload

sudo systemctl start sample.service

# サービスの確認 
sudo systemctl list-unit-files --type=service | grep sample
systemctlコマンドについては、以下の関連記事を参照のこと。
https://blogs.yahoo.co.jp/dk521123/36255225.html

実行結果例

「tailf /tmp/sample.log」で確認
Hello World!! ... 20170730-093727
Hello World!! ... 20170730-093730
Hello World!! ... 20170730-093733
Hello World!! ... 20170730-093736

■ トラブルシュート

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

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

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

■ 補足1 : 設定ファイルの文法

 以下が分かりやすい
http://qiita.com/a_yasui/items/f2d8b57aa616e523ede4
http://qiita.com/masami256/items/ef0f23125cf8255e4857

Unit・Before/After

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

Service・Type

 * サービスプロセスの起動完了の判定方法(以下は代表的な値)
`値`意味備考
Type=simple残プロセスは放置-
Type=forking最初のコマンドが終了したタイミングを起動完了と判断-
Type=oneshotコマンドが終了したら起動完了と判定して、サービスも終了したものと認識★重要★「RemainAfterExit=yes(コマンドの実行終了後もステータスをアクティブにしておきたい時に使う)」を設定する
「RemainAfterExit=yes」に関してはまったエピソードは以下の関連記事を参照のこと
https://blogs.yahoo.co.jp/dk521123/37395394.html
 * その他のタイプは、以下のサイトを参照のこと。
https://wiki.archlinux.jp/index.php/Systemd#.E3.82.BF.E3.82.A4.E3.83.97

Service・KillMode

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

■ 実例

Tomcat をサービスとしてあげる
 * 以下の関連記事でTomcatをサービスとして起動させる例を載せている
https://blogs.yahoo.co.jp/dk521123/36706185.html
https://blogs.yahoo.co.jp/dk521123/36735893.html


関連記事

CentOSでのサービス管理 ~ service・chkconfig / systemd ~

https://blogs.yahoo.co.jp/dk521123/36255225.html

Linuxの起動について ~ プロセス / デーモン ~

https://blogs.yahoo.co.jp/dk521123/34564457.html

Linux】systemd で、systemctl start ***.service 実行後、Active: inactive (dead) になってしまう

https://blogs.yahoo.co.jp/dk521123/37395394.html

Tomcatをデーモンとして起動するには ~ /etc/init.d / Debian編~

https://blogs.yahoo.co.jp/dk521123/34754575.html

Tomcatをデーモンとして起動するには ~ /etc/init.d / openSUSE編~

http://blogs.yahoo.co.jp/dk521123/33751398.html