如何让Systemd服务文件运行包含特殊字符的echo命令?

如何让Systemd服务文件运行包含特殊字符的echo命令?

我正在尝试编写一个服务文件来解除绑定 PCI 设备,如下所示,运行后systemctl stop servicefile-name

    ExecStop=/bin/echo 1 > "/sys/bus/pci/devices/0000\:03\:00.0/remove"

但是,解除绑定永远不会发生,并且设备仍然处于活动状态并正在运行。从 bash 命令行执行 echo 命令没有问题,并且可以很好地删除设备:echo 1 > /sys/bus/pci/devices/0000:03:00.0/remove

运行systemctl status servicefile-name显示 echo 命令运行时没有任何错误:(code=exited, status=0/SUCCESS)。我显然没有在服务文件中使用正确的 echo 命令语法。我也尝试删除转义字符,但仍然不起作用

ExecStop=/bin/echo 1 > "/sys/bus/pci/devices/0000:03:00.0/remove"

有谁知道如何在运行时从 systemd 服务文件中删除/取消绑定设备,并给出特殊字符“:”?

答案1

ExecStop=...不运行bash。因此,运算符 like >or 的&解释方式与 bash 解释它们的方式不同。 systemd将简单地运行/bin/echo并传递1, >, 和"sys-bus-pci-devices-0000:03:00.0-remove"作为参数。

如果你想>充当bash重定向,那么你需要bash使用 将此语句传递给解释器bash -c

尝试这个:

ExecStop=/bin/bash -c "/bin/echo 1 > /sys/bus/pci/devices/0000\:03\:00.0/remove"

我不太熟悉 GAD3R 建议的转义,但您也可以尝试转义字符串。

答案2

使用systemd-escape

$ systemd-escape --path "/sys/bus/pci/devices/0000:03:00.0/remove"
sys-bus-pci-devices-0000:03:00.0-remove

然后编辑你的单元文件:

ExecStop=/bin/echo 1 > "sys-bus-pci-devices-0000:03:00.0-remove"

man systemd-escape

相关内容