我对 systemd 背后的理念有些理解困难。我试图配置一个应该正常运行的服务,并且该服务依赖于 mariadb 才能正常工作。下面是我提出的(匿名).service 文件:
[Unit]
Description=My Service
Requires=mariadb.service
After=mariadb.service
[Service]
ExecStart=/usr/bin/python2.7 -u /home/serviceuser/service.py
WorkingDirectory=/home/serviceuser
User=serviceuser
[Install]
WantedBy=multi-user.target
它运行得很好,但我注意到有时服务会自行停止。经过一些调试,我发现这与 ubuntu 自动安装 mariadb 安全更新相吻合。测试后,我发现停止 mariadb 会先停止我的服务(这对我来说很有意义),但重新启动 mariadb 不会启动我的服务。
我认为 WantedBy 意味着 multi-user.target 确实希望我的服务运行。因此,只要没有任何事情阻止它,systemd 就应该尝试确保它运行。阻止它运行的原因可能是服务或其依赖项之一被明确停止。一旦阻止条件消失,systemd 应该重新启动该服务。
这个推理中的错误是什么导致服务无法再次启动?如何使用 systemd 实现我想要的行为?
答案1
mariadb 被设置为 My Service 的依赖项,因此启动它也会启动 mariadb(如果未运行)。因此,停止 mariadb 也会停止 My Service。
但是如果你只重启 mariadb,我的服务将不会自动启动。你可能想启用我的服务:systemctl enable My\ Service.service
这将配置它在启动后启动。但如果我正确停止,它将保持停止状态,直到重新启动或手动重启。
答案2
您可以添加 WantedBy=mariadb.service
[Unit]
Description=My Service
Requires=mariadb.service
After=mariadb.service
[Service]
ExecStart=/usr/bin/python2.7 -u /home/serviceuser/service.py
WorkingDirectory=/home/serviceuser
User=serviceuser
[Install]
WantedBy=multi-user.target
WantedBy=mariadb.service
这将使 systemd 知道 MariaDB 也想启动您的服务(现在您只能反过来做)。
另一件事是您应该再次启用您的服务(使用 daemon-reload 是不够的)
systemctl daemon-reload
systemctl enable <your_service>