我正在編寫一個 systemd 服務 ( /etc/systemd/system/name.service
)。該服務執行放置在~/folder/script.sh
.我無法在命令~/
內部使用ExecStart
,所以我使用/home/$(logname)/folder/script.sh
但它不起作用。
答案1
Systemd 的運作等級低於 shell 環境。我的意思是,當您執行命令時,它通常是 shell 環境的子進程,它是 init 守護程式(在本例中為 systemd)的子進程。這表示 systemd 單元看不到或服從您的 shell 環境,也看不到像~
.在文件中配置的任何環境變數(例如~/.profile
或 )~/.bashrc
都不適用。看什麼做apply 你可以輸入指令systemctl show-environment
。在我的系統(Ubuntu Server 和 Arch)上,這是PATH
和LANG
。更多資訊這裡。
對於用戶單元來說,這一切(或多或少)都是如此……但是 systemd 為用戶單元維護了一個稍微更健壯的環境,正如您應該在systemctl show-environment --user
.如果您運行了最後一個命令,它應該已經給出了您需要執行的操作。 Systemd(至少在我的系統上)將環境變數設定USER
為正在執行單元的使用者的使用者名稱。因此,將您的 ExecStart 行更改為/home/${USER}/folder/script.sh
.應該可以做到這一點。另請注意,我沒有使用(
& )
...根據 systemd 手冊頁,這不是必需的。大括號 ( {
& }
) 是為了防止由於某些非常奇怪的原因,您的使用者名稱中有空格。即使${HOME}/folder/script.sh
使用者的主目錄不在/home/
.