![Wie kann ich $(logname) im systemd-Exec-Befehl erhalten?](https://rvso.com/image/170290/Wie%20kann%20ich%20%24(logname)%20im%20systemd-Exec-Befehl%20erhalten%3F.png)
Ich schreibe einen systemd-Dienst ( /etc/systemd/system/name.service
). Dieser Dienst führt ein in platziertes Skript aus ~/folder/script.sh
. Ich kann es nicht ~/
innerhalb des ExecStart
Befehls verwenden, also verwende ich, /home/$(logname)/folder/script.sh
aber es funktioniert nicht.
Antwort1
Systemd arbeitet auf einer niedrigeren Ebene als Ihre Shell-Umgebung. Damit meine ich, wenn Sie einen Befehl ausführen, ist dies normalerweise ein untergeordneter Prozess Ihrer Shell-Umgebung, der wiederum ein untergeordneter Prozess Ihres Init-Daemons (in diesem Fall systemd) ist. Das bedeutet, dass systemd-Einheiten weder Ihre Shell-Umgebung noch Shell-Makros wie sehen oder befolgen . Alle in Dateien wie oder ~
konfigurierten Umgebungsvariablen gelten nicht. Um zu sehen, was~/.profile
~/.bashrc
tutUm zu übernehmen, können Sie den Befehl eingeben systemctl show-environment
. Auf meinen Systemen (Ubuntu Server und Arch) ist das PATH
und LANG
. Weitere InformationenHier.
Dies alles gilt (mehr oder weniger) auch für Benutzereinheiten … aber systemd verwaltet eine etwas robustere Umgebung für Benutzereinheiten, wie Sie bei sehen sollten systemctl show-environment --user
. Wenn Sie den letzten Befehl ausgeführt haben, sollte er Ihnen verraten haben, was Sie tun müssen. Systemd (zumindest auf meinen Systemen) setzt die Umgebungsvariable USER
auf den Benutzernamen des Benutzers, als der die Einheit ausgeführt wird. Ändern Sie also Ihre ExecStart-Zeile in /home/${USER}/folder/script.sh
. Das sollte reichen. Beachten Sie auch, dass ich (
& nicht verwendet habe )
… laut den Manualpages von systemd sollte dies nicht nötig sein. Die geschweiften Klammern ( {
& }
) sind für den Fall da, dass Ihr Benutzername aus irgendeinem seltsamen Grund Leerzeichen enthält. Sie können auch verwenden, ${HOME}/folder/script.sh
was auch funktionieren würde, wenn sich das Home-Verzeichnis des Benutzers woanders befindet als /home/
.