我需要从当前cgroup之外的systemd服务运行外部程序。
我找到了一个systemd-run
工具,可能会解决这个问题,但我仍然坚持使用systemd版本204,但尚未提供。
还有其他解决方案吗?
我的问题更详细:
应用程序捆绑在debian包中,将作为systemd服务安装和运行。
此服务稍后会下载较新版本的应用程序并运行dpkg -i myapplication.deb
。
在安装升级期间必须停止服务 - 但在cgroup中的所有进程结束之前它不会停止。现在我们遇到了死锁,因为dpkg
本身就在这个cgroup中运行。服务停止超时后,dpkg
将被终止并且未安装升级。
答案 0 :(得分:1)
您可以在/ run / systemd / system路径中动态创建服务。此路径是运行时服务目录。
稍后你告诉systemd重新加载它的状态。重新加载完成后,现在systemd知道您的服务。启动服务将在服务自己的cgroup中进行。
我认为你可以这样做:
#!/bin/sh
printf "[Service]\nType=oneshot\nExecStart=dpkg -i myapplication.deb" \
> /run/systemd/system/my-dpkg.service
if [ -f "/run/systemd/system/my-dpkg.service" ]; then
systemctl daemon-reload && \
systemctl start dpkg.service
fi