CentOS7サーバーには、TomcatWebサーバーとMySQLDBサーバーで構成されるアプリケーションスタックがあり、どちらも同じVMにインストールされています。
これらをこの順序で一緒に開始および停止します。
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
systemdユニットのドキュメントを読んで、Requires=
と一緒に始めることができました。 ディレクティブですが、systemctl stop tomcat.serviceでtomcatを停止すると、MySQLは実行を続けます。システムログで、MySQLを停止しようとさえしないことに気づいたので、systemdユニットに何か問題があるはずです。
これが私のユニットです:
# Systemd unit file for tomcat [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target mysql.service Requires=mysql.service [Service] Type=forking Environment=JAVA_HOME=/opt/jdk Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID User=tomcat Group=tomcat [Install] WantedBy=multi-user.target
承認された回答:
ここに表示されているのは、予想されるsystemdの動作です。 Requires=
依存関係により、mysql.service
が確認されます tomcat.service
が開始されるたびに開始されます 開始しますが、一度開始すると2つのユニットは独立しており、一方が停止してももう一方は停止しません。
本当にmysql.service
が必要な場合 tomcat.service
のときに停止します つまり、PartOf=
を使用できます 停止時と再起動時にユニットをリンクするディレクティブ。
あなたが説明した例の場合(mysql.service
tomcat.service
はいつでも停止します が停止している場合)、必要なのはPartOf=tomcat.service
を追加することです mysql.service
の定義に 。通常、これを行うための最良の方法は、オーバーライドファイルを使用することです。これは、systemctl edit mysql.service
で実行できます。 空のファイルでテキストエディタが開き、このスニペットを追加できます:
[Unit]
PartOf=tomcat.service
これはファイル/etc/systemd/system/mysql.service.d/override.conf
に保存されます これはmysql.service
の一部になります 、systemctl cat mysql.service
で確認できます 。
これらの変更とsystemctl daemon-reload
の後 、これは期待どおりに機能するはずです…
注文に関しては、すべてが1つのAfter=mysql.service
で期待どおりに機能するはずです。 tomcat.service
にあります 、サービスを停止するときに依存関係が逆の順序で尊重されるため。 (つまり、この場合、tomcat.service
最初に停止され、次にmysql.service
が停止されます 。)
この方法でユニットを停止することは必ずしも良い考えではないかもしれません…おそらく少し良いアプローチは、別の.target
を作成することです。 制御するすべてのサービスをグループ化するユニット。おそらくwebservices.target
のようなものです 。
次のようなコンテンツでそのユニットを作成します:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
そして、両方のtomcat.service
およびmysql.service
PartOf=webservices.target
を設定します 、上記のオーバーライドメカニズムを使用します。
systemctl enable webservices.target
を使用してターゲットユニットを有効にします 、次に、systemctl start webservices.target
を使用して両方のサービスを開始および停止できます。 またはsystemctl stop webservices.target
。