Linux 如何在独立cgroup中从systemd服务运行外部程序

Linux 如何在独立cgroup中从systemd服务运行外部程序,linux,systemd,Linux,Systemd,我需要在当前cgroup之外从systemd服务运行外部程序。 我已经找到了一个systemd run工具,它可能会解决这个问题,但我仍然坚持使用systemd版本204,因为它还不可用。 还有其他解决办法吗 我的问题更详细: 应用程序捆绑在debian软件包中,将作为systemd服务安装和运行。 此服务稍后将下载较新版本的应用程序并运行dpkg-i myapplication.deb。 安装升级期间必须停止服务-但在cgroup中的所有进程结束之前,服务不会停止。现在我们有了死锁,因为dpk

我需要在当前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

欢迎来到StackOverflow。几乎在任何时候,只要你想发布代码,或是想保留格式的数据,你都可以用四个空格(或一个制表符)将其缩进是标题的标记快捷码,因此不是
#/bin/sh
,我们看到了/大号文本中的bin/sh。您可以使用backticks(QWERTY上方1键旁边的撇号)来编写内联代码。因此,如果我用“``来包围Hello World,我会得到
Hello World