So starten Sie einen systemd-Dienst nach der Benutzeranmeldung und beenden ihn vor der Benutzerabmeldung

10

Ich habe eine Fedora 23 Maschine.

Ich habe ein Verzeichnis- / Dateisynchronisierungs-Bash-Skript, das mein lokales / Home-Verzeichnis mit einem Remote-Verzeichnis (auf einem NAS-Computer) synchronisiert. Ich führe es manuell aus, möchte aber einen systemd-Dienst erstellen und ihn flexibler gestalten, da andere Benutzer meinen PC mit ihren eigenen Benutzeranmeldeinformationen verwenden. Ich möchte wissen, wann ein Benutzer angemeldet ist, und anschließend meinen Dienst starten.

Kann ich etwas aus der systemd-Datei meines Dienstes heraus tun oder muss ich das anhand meines Codes im Skript überprüfen?

Ich muss nur sicherstellen, dass ich Zugriff auf Umgebungsvariablen (wie $ USER) habe, und es als Dienst ausführen.

Meine Hauptdokumentationsquelle ist dieser Link https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

GeorgeKaf
quelle
Funktioniert systemctl --userF23?
user1686
Ich denke schon, es gibt eine Liste und eine Nachricht zurück 76 loaded units listed.
GeorgeKaf
Hier ist ein weiterer Ansatz, der für Sie möglicherweise funktioniert: unix.stackexchange.com/a/109270/111707 Schreiben Sie ein kleines Python-Skript, das Sie .bashrcbeim Anmelden starten . Dann wartet es auf das Gnome-Abmeldesignal und fährt sich selbst herunter.
IanB
@ IanB Danke, ich werde es testen. Es tut nie weh, so etwas in der Nähe zu haben.
GeorgeKaf

Antworten:

14

Verwenden Sie systemd , das bereits Unterstützung für Benutzersitzungen enthält. Sie sollten sich bereits darauf verlassen (unabsichtlich).

Erstellen Sie das Serviceverzeichnis

mkdir -p $HOME/.local/share/systemd/user

Erstellen Bearbeiten Sie eine Servicedatei (vim, gedit, geany - was auch immer Sie wollen)

vim $HOME/.local/share/systemd/user/my.service

Es sollte ungefähr so ​​aussehen, wenn es sich um einen permanenten Dienst handelt.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Aber es hört sich so an, als ob Sie es lieber einmal auslösen und dann gut damit umgehen möchten. Verwenden Sie also lieber eine One-Shot-Konfiguration wie diese:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Dies setzt natürlich voraus, dass Ihr Skript ausführbar ist, dh:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

Andernfalls müssten Sie den Pfad zum jeweiligen Interpreter voranstellen:

ExecStart=/bin/bash /path/to/start/script arguments

Laden Sie nun systemd neu (und melden Sie sich zum Testen erneut an).

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Wenn Sie weitere Informationen benötigen, lesen Sie beispielsweise das Arch-Wiki . Dieser Askubuntu-Thread hat verschiedene Ideen, darunter übrigens meine.

Sie können das Verhalten (wenn Sie Root sind) auf andere Benutzer ausweiten, indem Sie den Dienst global definieren. Dazu müssten Sie die Servicedatei in / usr / share / systemd / user / not in $ HOME / .local / share / systemd / user erstellen .

angst
quelle
1
Hallo, die Antwort war gut. Es funktioniert jedoch nur, wenn der Dienst beim ersten Anmelden gestartet und bei der letzten Benutzersitzung gestoppt werden soll .
Anwar
4
Sie benötigen das Flag --user, um den Dienst zu aktivieren. "systemctl --user enable my.service"
blushrt
0

Ich weiß das ein paar Jahre alt, aber die Antwort von anx hat mir nur geholfen. Also, ich denke es ist immer noch relevant. Auch dies ist eher ein Kommentar, aber ich habe dieses Privileg nicht, also poste ich es als "Antwort". Jedenfalls...

Unter Linux Mint 19 konnte ich den Dienst nicht "aktivieren", wenn sich das Skript in "$ HOME / .local / share / systemd / user" befand. Der Versuch, dies zu tun, führte immer zu einem Fehler. Ich könnte es jedoch problemlos über das Verzeichnis '$ HOME / .local / share / systemd / user' starten. Nachdem ich das Skript in '/ usr / share / systemd / user /' verschoben hatte, erlaubte mir systemd, es ohne Probleme zu aktivieren.

notorious.dds
quelle