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

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

在 CentOS7 服务器上,我有一个由 Tomcat Web 服务器和 MySQL DB 服务器组成的应用程序堆栈,两者都安装在同一虚拟机上。我希望它们按以下顺序一起启动和停止:

开始: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=多用户.target

答案1

您在这里看到的是预期的 systemd 行为。依赖关系Requires=将确保mysql.service无论何时启动都启动tomcat.service,但是一旦启动,两个单元都是独立的,并且一个单元不会在另一个单元停止时停止。

如果你确实想在 ismysql.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

经过这些更改和 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

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

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

相关内容