はじめに
* 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 samplesystemctlコマンドについては、以下の関連記事を参照のこと。
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(コマンドの実行終了後もステータスをアクティブにしておきたい時に使う)」を設定する |
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
参考文献
http://qiita.com/yosi-q/items/55d6d3d6834c778ae2eahttp://qiita.com/nownabe/items/ca45bb4829d75460b31e