Ben*_*ner 3 command-line bash scripts services systemd
我有一个调用脚本的 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
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下内容调用脚本:
$ sudo systemctl start myservice@"--flag argument".service
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不起作用,并且--标志的部分似乎被转换为//. 该服务看起来正在运行,但似乎并未运行,并且在信息中我可以看到它systemd status已将.--//
我试图-通过在它们前面加上前缀来逃避\,但是这也不起作用,而且服务实际上并不是用这种方法启动的。
任何建议或尝试的事情将不胜感激!
-to的转换/是为了允许模板参数和单元名称的其他部分中存在路径。这在“包含在单元名称中的字符串转义”部分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
Run Code Online (Sandbox Code Playgroud)
您应该用作\x2d\x2dflag\x20argument模板参数。