特定の順序で開始する必要がある4つのサービスを設定しました。たとえば、
serv1 => serv2 => serv3サービス4 |
serv3 または serv4 の両方が serv2 の後に開始される限り、順序は重要ではありません。
だから、次のサービスファイルを作成しました。
serv3.service(serv4.serviceに似ています):
[Unit]
Description=Starts serv3
After=network.target serv1.service serv2.service
[Service]
Type=forking
User=root
ExecStart=/usr/bin/services/serv3start.sh
ExecStop=/usr/bin/services/serv3stop.sh
Restart=always
[Install]
WantedBy=multi-user.target
serv2.サービス:
[Unit]
Description=Starts serv2
After=network.target serv1.service
[Service]
Type=forking
User=root
ExecStart=/usr/bin/services/serv2start.sh
ExecStop=/usr/bin/services/serv2stop.sh
Restart=always
[Install]
WantedBy=multi-user.target
serv1.サービス:
[Unit]
Description=Starts serv1
After=network.target
[Service]
Type=forking
User=root
ExecStart=/usr/bin/services/serv1start.sh
ExecStop=/usr/bin/services/serv1stop.sh
Restart=always
[Install]
WantedBy=multi-user.target
この.sh
スクリプトは1行のスクリプトファイルに過ぎず、各スクリプトは異なるスクリプトを開始/停止します。Javaプログラム。
今まではそんなに良くなった。
問題は、 serv3 または serv4 を再起動すると(たとえば、経由でsystemctl restart serv3
)、4 つのサービスすべてが再起動されることです。
私は何が間違っていましたか?
答え1
2日間の困難を経験した後、ついに問題が何であるかを見つけましたType=forking
。明らかに、私のすべてのサービスはいくつかの共通の親プロセスのフォークであり、サービスの1つを再起動したときに実際には親プロセスを再起動し、親プロセスは別のプロセスを再起動しました。
誰かが私に完全な説明を与えると、私はそれを正解としてマークします。
鍵は.sh
Javaプログラムを起動するスクリプトだと思います。どちらも次のとおりです。
#! /bin/sh
java -jar /path_to_java_program/java_program.jar&
私のJavaプログラムには起動スクリプトが含まれているので、すべてのプログラムで次のことを行います。
[Unit]
Description=Starts java_program
After=network.target and other dependencies
[Service]
Type=simple
User=root
ExecStart=/path_to_the_java_program/java_program.jar
ExecStop=/usr/bin/services/serv1stop.sh
Restart=always
[Install]
WantedBy=multi-user.target