Jak uruchomić usługę systemową po zalogowaniu użytkownika i zatrzymać ją przed wylogowaniem użytkownika

10

Mam maszynę Fedora 23.

Mam skrypt bash synchronizujący katalog / plik, który synchronizuje mój katalog lokalny / domowy ze zdalnym katalogiem (na komputerze NAS). Uruchamiam go ręcznie, ale chciałbym utworzyć usystematyzowaną usługę i uczynić ją bardziej elastyczną, ponieważ inne osoby używają mojego komputera z własnymi danymi uwierzytelniającymi, chciałbym wiedzieć, kiedy użytkownik jest zalogowany i później uruchomić moją usługę.

Czy mogę coś zrobić z pliku systemowego mojej usługi lub czy muszę to sprawdzić w kodzie w skrypcie?

Muszę tylko upewnić się, że mam dostęp do zmiennych środowiskowych (takich jak $ USER) i uruchomić je jako usługę.

Moim głównym źródłem dokumentacji jest ten 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
źródło
Czy systemctl --userdziała na F23?
user1686
Chyba tak, zwraca listę i wiadomość 76 loaded units listed.
GeorgeKaf,
Oto inne podejście, które może Ci się przydać : unix.stackexchange.com/a/109270/111707 Napisz mały skrypt Pythona, który uruchamiasz .bashrcpodczas logowania, a następnie nasłuchuje sygnału wylogowania z Gnome i wyłącza się.
IanB,
@IanB Dziękuję, przetestuję to. Nigdy nie boli mieć coś takiego w pobliżu.
GeorgeKaf,

Odpowiedzi:

15

Użyj systemd, to już obejmuje obsługę sesji użytkownika, w rzeczywistości powinieneś już na nim polegać (nieświadomie).

Utwórz katalog usług

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

Utwórz edycję pliku usługi (vim, gedit, geany - cokolwiek chcesz)

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

Powinno to mniej więcej tak wyglądać, jeśli jest to usługa stała.

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

Ale wygląda na to, że wolisz go raz uruchomić, a potem bądź dobry, więc raczej użyj konfiguracji oneshot:

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

Zakłada to oczywiście, że twój skrypt jest wykonywalny, tj .:

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

W przeciwnym razie musisz przygotować ścieżkę do odpowiedniego tłumacza:

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

Teraz ponownie załaduj systemd (i ponownie zaloguj się w celu przetestowania)

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

Jeśli potrzebujesz więcej informacji, zajrzyj na przykład na Arch-Wiki . Ten wątek askubuntu ma różne pomysły, w tym zresztą kopalni.

Możesz rozszerzyć to zachowanie (jeśli jesteś rootem) na innych użytkowników, definiując usługę globalnie. W tym celu musisz utworzyć plik usługi w / usr / share / systemd / user / not in $ HOME / .local / share / systemd / user .

anx
źródło
1
cześć, odpowiedź była dobra. Działa to jednak tylko wtedy, gdy usługa powinna zostać uruchomiona przy pierwszym logowaniu i zatrzymana przy ostatniej sesji użytkownika.
Anwar
4
Podczas włączania usługi potrzebujesz flagi --user. „systemctl --user enable my.service”
blushrt
0

Wiem, że to kilka lat, ale odpowiedź od anx po prostu mi pomogła. Sądzę więc, że nadal jest to właściwe. Jest to także bardziej komentarz, ale nie mam takiej wiedzy, więc zamieszczam go jako „odpowiedź”. W każdym razie...

W systemie Linux Mint 19 nie mogłem „włączyć” usługi, gdy skrypt znajdował się w katalogu „$ HOME / .local / share / systemd / user”. Próba zrobienia tego zawsze powodowała błąd. Mógłbym jednak dobrze go uruchomić z katalogu „$ HOME / .local / share / systemd / user”. Po przeniesieniu skryptu do „/ usr / share / systemd / user /” systemd pozwolił mi go włączyć bez problemu.

notorious.dds
źródło