CentOS7サーバーにはTomcat WebサーバーとMySQL DBサーバーで構成されたアプリケーションスタックがあり、両方とも同じ仮想マシンにインストールされています。次の順序で一緒に開始して停止したい。
開始: MySQL-->Tomcat 停止: Tomcat-->MySQL
systemd 単位のドキュメントを読み込み、Requires=
ディレクティブを使用して起動できましたが、systemctl stop tomcat.serviceを使用してtomcatを停止すると、MySQLは引き続き実行されます。システムログを見ると、MySQLを停止しようとしなかったため、systemdデバイスに問題があることがわかりました。
これは私の単位です:
# Tomcatのシステム単位ファイル [単位] Description=Apache Tomcat Webアプリケーションコンテナ 以降=syslog.target network.target mysql.service リクエスト=mysql.service [提供する] タイプ=フォーク 環境=JAVA_HOME=/opt/jdk 環境=CATALINA_PID=/opt/tomcat/temp/tomcat.pid 環境=CATALINA_HOME=/opt/tomcat 環境=CATALINA_BASE=/opt/tomcat ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID ユーザー=トムキャット グループ=トムキャット [インストールする] WantedBy =マルチユーザー。ターゲット
答え1
ここに表示されるのは、予想されるシステムの動作です。依存関係は起動するたびに開始さRequires=
れることを保証しますが、一度起動した後は両方のデバイスが独立しており、他のデバイスが停止しても1つのデバイスは停止しません。mysql.service
tomcat.service
mysql.service
isのときに本当に停止したい場合は、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
...期待どおりに動作します...
順序に関してサービスを停止すると、依存関係は逆の順序で尊重されるため、すべてが期待どおりに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
amysql.service
を設定します。PartOf=webservices.target
有効にするターゲットデバイスを使用すると、systemctl enable webservices.target
両方のsystemctl start webservices.target
サービスまたはを使用して一緒に起動および停止できますsystemctl stop webservices.target
。