如何在 systemd exec 指令中取得 $(logname) ?

如何在 systemd exec 指令中取得 $(logname) ?

我正在編寫一個 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)上,這是PATHLANG。更多資訊這裡

對於用戶單元來說,這一切(或多或少)都是如此……但是 systemd 為用戶單元維護了一個稍微更健壯的環境,正如您應該在systemctl show-environment --user.如果您運行了最後一個命令,它應該已經給出了您需要執行的操作。 Systemd(至少在我的系統上)將環境變數設定USER為正在執行單元的使用者的使用者名稱。因此,將您的 ExecStart 行更改為/home/${USER}/folder/script.sh.應該可以做到這一點。另請注意,我沒有使用(& )...根據 systemd 手冊頁,這不是必需的。大括號 ( {& }) 是為了防止由於某些非常奇怪的原因,您的使用者名稱中有空格。即使${HOME}/folder/script.sh使用者的主目錄不在/home/.

相關內容