在 systemd 单元中使用动态日期

在 systemd 单元中使用动态日期

我尝试使用日期输出作为 systemd 单元中日志文件名的一部分。这里的例子:

[Unit]
Description=TCS minetest server unit

[Service]
Type=simple
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$$(date +%%Y_%%m_%%d).txt
ExecReload=/bin/kill -HUP $MAINPID
User=tcs

[Install]
WantedBy=multi-user.target

但我得到日志文件:

ls /home/tcs/logs/
'debug_$(date'

如何使用当前日期作为日志文件名?

答案1

不直接支持这种类型的语法,如system.service 的手册页

该语法受到 shell 语法的启发,但仅理解以下段落中描述的元字符和扩展,并且变量的扩展有所不同。具体来说,不支持使用“<”、“<<”、“">”和“>>”的重定向、使用“|”的管道、使用“&”在后台运行程序以及 shell 语法的其他元素。

“以下几段”主要包括基本的环境变量替换、路径搜索和一些C转义。

一般来说,您可以通过编写自己的 shell 脚本来设置进程,然后将该脚本指定为ExecStartsystemd 服务上的选项,从而绕过这些限制。

在您的具体情况下,您应该能够通过将日期替换显式传递给 shell 来使其工作:

ExecStart=/bin/bash -c '/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$(date +%Y_%m_%d).txt'

答案2

您可以将动态部分写入环境文件并稍后使用变量。像这样的东西:

[Unit]
Description=TCS minetest server unit

[Service]
Type=simple
EnvironmentFile=-/dev/shm/tcs.env
ExecStartPre=sh -c 'echo date=$(date +%%Y_%%m_%%d) > /dev/shm/tcs.env'
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_${date}.txt
ExecStartPost=rm /dev/shm/tcs.env
ExecReload=/bin/kill -HUP $MAINPID
User=tcs

[Install]
WantedBy=multi-user.target

我发现这比将ExecStart命令包装在sh -c.ExecStartPre可以多次使用(记得>>在需要时使用追加)。

相关内容