我需要从当前 cgroup 之外的 systemd 服务运行外部程序。
我找到了一个 systemd-run
工具,它可能会解决这个问题,但我仍然使用 systemd 版本 204,它尚不可用。
还有其他解决方案吗?
我的问题更详细:
应用程序捆绑在 debian 软件包中,并将作为 systemd 服务安装和运行。
该服务稍后会下载更新版本的应用程序并运行 dpkg -i myapplication.deb
。
在安装升级期间必须停止服务 - 但它不会停止,直到 cgroup 中的所有进程结束。现在我们陷入僵局,因为 dpkg
本身正在这个 cgroup 中运行。服务停止超时后,dpkg
被杀死,升级未安装。
最佳答案
您可以在/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
关于linux - 如何在独立cgroup中从systemd服务运行外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674151/