■ はじめに
* 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