![如何让Systemd服务文件运行包含特殊字符的echo命令?](https://linux22.com/image/201848/%E5%A6%82%E4%BD%95%E8%AE%A9Systemd%E6%9C%8D%E5%8A%A1%E6%96%87%E4%BB%B6%E8%BF%90%E8%A1%8C%E5%8C%85%E5%90%AB%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%9A%84echo%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我正在尝试编写一个服务文件来解除绑定 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