在 systemd 单元中使用动态日期

Dar*_*god 3 date systemd services systemd-unit

我尝试使用日期输出作为 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
Run Code Online (Sandbox Code Playgroud)

但我得到日志文件:

ls /home/tcs/logs/
'debug_$(date'
Run Code Online (Sandbox Code Playgroud)

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

Hax*_*iel 5

不直接支持这种类型的语法,如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'
Run Code Online (Sandbox Code Playgroud)