GNU/Linux >> Linux の 問題 >  >> Linux

Systemdユニットを別のユニットと一緒に停止します。作品を始めますか?

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を設定します 、上記のオーバーライドメカニズムを使用します。

関連:ブートストラップ日付ピッカーはGridViewの最初の行でのみ機能しますか?

systemctl enable webservices.targetを使用してターゲットユニットを有効にします 、次に、systemctl start webservices.targetを使用して両方のサービスを開始および停止できます。 またはsystemctl stop webservices.target


Linux
  1. LinuxでSystemctlを使用してSystemdサービスを管理する方法

  2. 別の成功時にSystemdRunユニット?

  3. MySQLサービスの予期しない開始と停止を解決する方法

  1. CentOS/RHEL 7 でユーザープロセスグループに対して systemd でリソース (cgroup) を制御する方法

  2. systemd サービスを停止する方法

  3. シャットダウン直前にsystemdでスクリプトを実行する方法は?

  1. Linux – SystemdでTtyを減らす方法は?

  2. Systemdが開始直後にサービスを停止するのはなぜですか?

  3. ネットワークサービスでStandardioを使用して単純なスクリプトを作成するようにSystemdを構成するにはどうすればよいですか?