A をstart,stopするだけで B,C,D がうまく開始や停止するやつは ターゲットユニットと呼ぶらしい。
A.target を起動したら
B.service を起動し、続けて C.socket、D.socket を起動する
C.socket で待ち受け、着信したら C@.service を起動する
また、Aを終了すると
B をstopで起動した上で C,D を停止する
A.target
[Unit] Description = システム起動 全体統括 Requires = B.service C.socket D.socket After = B.service [Install] WantedBy = multi-user.target
Aが立ち上がったときに B,C,D を自動で起動する。 さらに、Bを先に起動する
B.service
[Unit] Description = 起動、終了 前処理 PartOf = A.target [Service] Type = oneshot RemainAfterExit = yes ExecStart = /opt/hoge/bin/B.sh start ExecStop = /opt/hoge/bin/B.sh stop
システムの前処理をするプログラム。 常駐はしないので Typeを OneShot にする
このとき RemainAfterExit = yes にしておくと、終了してもinactive扱いにならない
C.socket
[Unit] Description = サーバ ソケット C PartOf = A.target [Socket] ListenStream = 0.0.0.0:12345 Accept = yes [Install] WantedBy = sockets.target
プログラムC の待ち受けを設定
プログラムD も同じ
C@.service
[Unit] Description = サーバ プログラム C [Service] ExecStart = /opt/hoge/bin/C.php StandardInput = socket StandardOutput = socket StandardError = journal
待ち受け後に プログラムC を起動するための設定。
この設定のときは、プログラムC が動作している最中に C.socket の停止や再起動が発生しても プログラムC は停止しない。
sshとかの挙動と同じ。