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