Wie kann ich $(logname) im systemd-Exec-Befehl erhalten?

Wie kann ich $(logname) im systemd-Exec-Befehl erhalten?

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 ExecStartBefehls verwenden, also verwende ich, /home/$(logname)/folder/script.shaber 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~/.bashrctutUm zu übernehmen, können Sie den Befehl eingeben systemctl show-environment. Auf meinen Systemen (Ubuntu Server und Arch) ist das PATHund 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 USERauf 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.shwas auch funktionieren würde, wenn sich das Home-Verzeichnis des Benutzers woanders befindet als /home/.

verwandte Informationen