在 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.service
并mysql.service
设置 a 。PartOf=webservices.target
使用 启用目标单元systemctl enable webservices.target
,然后可以使用systemctl start webservices.target
或一起启动和停止这两个服务systemctl stop webservices.target
。