与另一个一起停止 systemd 单元。开始工作

J.B*_*.B. 5 systemd

在 CentOS7 服务器上,我有一个由 Tomcat Web 服务器和 MySQL DB 服务器组成的应用程序堆栈,它们都安装在同一个 VM 上。我希望他们按以下顺序一起开始和停止:

开始:MySQL--> Tomcat
停止:Tomcat--> MySQL

阅读 systemd 单元文档,我设法让它们与Requires=指令一起启动,但是当我使用 systemctl stop tomcat.service 停止 tomcat 时,MySQL 继续运行。在系统日志中,我注意到它甚至没有尝试停止 MySQL,所以 systemd 单元一定有问题。

这是我的单位:

# 用于 tomcat 的 Systemd 单元文件
[单元]
描述=Apache Tomcat Web 应用程序容器
After=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

用户=tomcat
组=tomcat

[安装]
WantedBy=multi-user.target

fil*_*den 14

您在这里看到的是预期的 systemd 行为。该Requires=依存度将确保mysql.service无论何时开始tomcat.service启动,但一旦启动两个单元是独立的,当对方是一个不会被停止。

如果你真的想mysql.service在什么时候停止tomcat.service,你可以使用在停止和重启时链接单元的PartOf=指令

对于您描述的示例(mysql.service每当停止时tomcat.service停止),您需要的是添加PartOf=tomcat.servicemysql.service. 通常,最好的方法是使用覆盖文件,您可以使用systemctl edit mysql.service它打开一个带有空文件的文本编辑器,然后您可以向其中添加以下代码段:

[Unit]
PartOf=tomcat.service
Run Code Online (Sandbox Code Playgroud)

这将保存在/etc/systemd/system/mysql.service.d/override.conf成为 一部分的文件中mysql.service,您可以使用systemctl cat mysql.service.

在这些更改和 a 之后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
Run Code Online (Sandbox Code Playgroud)

然后使用上述覆盖机制同时设置tomcat.servicemysql.service设置 a PartOf=webservices.target

使用 启用目标单元systemctl enable webservices.target,然后您可以使用systemctl start webservices.target或启动和停止这两个服务systemctl stop webservices.target

  • 按照您的建议创建一个`webservices.target` 效果很好。还发现了`systemctl edit ...`的存在,谢谢! (3认同)