如何转义 systemd 说明符以传递给 ExecStart 中的命令

How to escape a systemd Specifier to pass to the command in ExecStart

我编写了以下 systemd 服务 tcpdumpd.service 来启动持久的 tcpdump 记录。

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_%Y-%m-%d_%H:%M:%S.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target

tcpdump 允许 strftime 占位符,例如 %H 表示小时,%M 表示分钟等等,以允许您创建时间戳文件。

但是,systemd 有特殊的说明符,无法在其中使用,例如 (%n, %N, %p, %i, %U, %u, %m, %H, %b, %v)因此,任何重叠的说明符,如 %m 和 %H 都会传递来自 systemd 的信息,并且不允许将占位符传递给 tcpdump 以制作时间戳。

有谁知道是否有办法在 systemd 中转义说明符,以便我可以将 %m 和 %H 传递给 tcpdump?

我曾尝试转义 %%m\%m 等特殊说明符,但没有成功。

但是,如果您需要完成这项工作,这里是解决方法:

创建包含 TCPDUMP_FORMAT 变量定义的文件 tcpdumpd.environment

TCPDUMP_FORMAT=%Y-%m-%d_%H:%M:%S

修改tcpdumpd.service:添加EnvironmentFile=选项,格式字符串替换为${TCPDUMP_FORMAT}.

[Unit]
Description=TCPDumpd
After=multi-user.target network.target

[Service]
Type=simple
EnvironmentFile=tcpdumpd.environment
ExecStart=/usr/sbin/tcpdump -pni eth0 -s65535 -G 3600 -w '/var/log/tcpdump/trace_${TCPDUMP_FORMAT}.pcap' -z gzip
Restart=on-abort

[Install]
WantedBy=multi-user.target

Does anyone know if there is a way to escape the specifiers in systemd so I can pass the %m and %H through to tcpdump?

是:%%m%%H

参见man systemd.unit

"%%" | Single percent sign | Use "%%" in place of "%" to specify a single percent sign.