Systemd

在 systemd 單元中使用動態日期

  • April 27, 2022

我嘗試使用日期輸出作為 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'

如何使用目前日期作為日誌文件名?

不直接支持這種類型的語法,如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'

引用自:https://unix.stackexchange.com/questions/556008