Come avviare un servizio systemd dopo l'accesso dell'utente e interromperlo prima della disconnessione dell'utente


10

Ho una macchina Fedora 23.

Ho uno script bash di sincronizzazione directory / file che sincronizza la mia directory local / home con una directory remota (in una macchina NAS). Lo eseguo manualmente, ma vorrei creare un servizio systemd e renderlo più flessibile, poiché altre persone usano il mio PC con le proprie credenziali utente, vorrei sapere quando un utente ha effettuato l'accesso e avviare il servizio in seguito.

C'è qualcosa che posso fare dal file systemd del mio servizio o dovrò controllarlo dal mio codice nello script?

Devo solo assicurarmi di avere accesso alle variabili di ambiente (come $ USER) ed eseguirlo come servizio.

La mia principale fonte di documentazione è questo 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


Fa systemctl --useril lavoro sulla F23?
user1686

Immagino di sì, restituisce un elenco e un messaggio 76 loaded units listed.
GeorgeKaf,

Ecco un altro approccio che potrebbe funzionare per te: unix.stackexchange.com/a/109270/111707 Scrivi un piccolo script Python da cui .bashrcaccedi al login, quindi ascolta il segnale di logout di Gnome e si spegne.
IanB

@IanB Grazie, lo proverò. Non fa mai male avere qualcosa del genere in giro.
GeorgeKaf,

Risposte:


15

Usa systemd e include già il supporto per le sessioni utente, infatti dovresti già dipenderne (inconsapevolmente).

Creare la directory di servizio

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

Crea modifica un file di servizio (vim, gedit, geany - qualunque cosa tu voglia)

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

Dovrebbe essere più o meno così, se è un servizio permanente.

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

Ma sembra che tu voglia attivarlo una volta, quindi essere bravo con esso, quindi piuttosto usa una configurazione oneshot come questa:

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

Questo ovviamente presuppone che il tuo script sia eseguibile, ovvero:

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

Altrimenti dovresti anteporre il percorso al rispettivo interprete:

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

Ora ricarica systemd (e accedi nuovamente per motivi di test)

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

Per ulteriori informazioni, consultare Arch-Wiki, ad esempio. Questo thread di askubuntu ha varie idee, tra cui la mia.

È possibile estendere il comportamento (se si è root) ad altri utenti definendo il servizio a livello globale. Per fare ciò è necessario creare il file di servizio in / usr / share / systemd / user / non in $ HOME / .local / share / systemd / user .


1
ciao, la risposta è stata buona. Funzionerà solo se il servizio deve essere avviato al primo accesso e arrestato all'ultima sessione dell'utente.
Anwar,

4
È necessario il flag --user quando si abilita il servizio. "systemctl --user enable my.service"
blushrt,

0

Lo so da qualche anno, ma la risposta di anx mi ha appena aiutato. Quindi, suppongo sia ancora pertinente. Inoltre, questo è più un commento, ma non ho quel privilegio, quindi lo inserisco come una "risposta". Ad ogni modo ...

Con Linux Mint 19 non riuscivo a "abilitare" il servizio quando lo script si trovava in '$ HOME / .local / share / systemd / user'. Tentare di farlo ha sempre provocato un errore. Potrei, tuttavia, avviarlo bene dalla directory '$ HOME / .local / share / systemd / user'. Dopo aver spostato lo script in '/ usr / share / systemd / user /', systemd mi ha permesso di abilitarlo senza problemi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.