将“标志”参数传递给 Systemd 服务

将“标志”参数传递给 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

我试图用类似下面的方法调用该脚本:

$ 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模板参数。

相关内容