如何在 systemd exec 命令中獲取 $(logname) ?
我正在編寫一個系統服務(
/etc/systemd/system/name.service
)。該服務執行放置在~/folder/script.sh
. 我不能~/
在ExecStart
命令中使用,所以我使用/home/$(logname)/folder/script.sh
但它不起作用。
Systemd 的執行級別低於您的 shell 環境。我的意思是,當你執行一個命令時,它通常是你的 shell 環境的一個子程序,它是你的 init 守護程序(在這種情況下是 systemd)的一個子程序。這意味著 systemd 單元不會看到或服從您的 shell 環境,也不會像
~
. 在文件中配置的任何環境變數都適用~/.profile
或~/.bashrc
不適用。要查看適用的內容,您可以鍵入命令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/
.