我尝试使用日期输出作为 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 脚本来设置进程,然后将该脚本指定为ExecStart
systemd 服务上的选项,从而绕过这些限制。
在您的具体情况下,您应该能够通过将日期替换显式传递给 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
可以多次使用(记得>>
在需要时使用追加)。