Bash

如何在 systemd exec 命令中獲取 $(logname) ?

  • April 1, 2020

我正在編寫一個系統服務(/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)上,這是PATHLANG. 更多資訊在這裡

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

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