![将“标志”参数传递给 Systemd 服务](https://linux22.com/image/1192224/%E5%B0%86%E2%80%9C%E6%A0%87%E5%BF%97%E2%80%9D%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92%E7%BB%99%20Systemd%20%E6%9C%8D%E5%8A%A1.png)
我有一个调用脚本的 Systemd 服务。该脚本采用其自己的参数,其中一些是命名参数。我目前有以下服务:
[Unit]
Description=My Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=no
User=corvus
Environment="ARGS=%I"
ExecStart=/path/to/script.sh $ARGS
[Install]
WantedBy=multi-user.target
我试图用类似下面的方法调用该脚本:
$ sudo systemctl start myservice@"--flag argument".service
然而这似乎不起作用,--
标志的一部分似乎被转换成了//
。服务看起来好像正在运行,但似乎并没有运行,而且在systemd status
信息中我可以看到它用替换--
了//
。
我曾尝试-
通过在它们前面加上但是来逃避这个\
问题,但这也不起作用,而且服务实际上并没有用这种方法启动。
任何指示或值得尝试的事情都将不胜感激!
答案1
-
的转换/
为允许模板参数中的路径和单元名称的其他部分。这在 中介绍man systemd.unit
,“用于包含在单位名称中的字符串转义”部分:
有时将任意字符串转换为单元名称很有用。为了方便起见,使用字符串转义方法,以便将包含任意字节值(除
NUL
)的字符串映射到有效的单元名称及其受限字符集。常见的特殊情况是反映文件系统层次结构中对象路径的单元名称。示例:设备单元dev-sda.device
是指文件系统中具有设备节点的设备/dev/sda
。转义算法的操作如下:给定一个字符串,任何“
/
”字符都将被替换为“-
”,并且所有其他非 ASCII 字母数字、“:
”、“_
”或“.
”的字符都将替换为 C 样式的“\x2d
”转义。此外,.
当“ ”作为转义字符串中的第一个字符出现时,它将被替换为这种 C 样式的转义。[...]
这种转义是完全可逆的,只要知道转义的字符串是否是路径(路径和非路径字符串的反转义结果是不同的)。 systemd-escape(1) 命令可用于对任意字符串应用和反转转义。使用
systemd-escape --path
转义路径字符串,以及systemd-escape
沒有--path
其他方式。
所以:
% systemd-escape -- "--flag argument"
\x2d\x2dflag\x20argument
您应该将其用作\x2d\x2dflag\x20argument
模板参数。