Come posso far funzionare il mio servizio systemd tramite un utente specifico e avviare all'avvio?

78

Ho appena effettuato l'aggiornamento dal server 14 di Ubuntu alla versione 15. Ho avuto problemi a ottenere il mio script upstart dopo l'aggiornamento, e ho letto che systemd è il nuovo predefinito. Sono lontano da un esperto di linux, quindi per favore andate piano con me: -)

Ecco quello che era il mio script di upstart:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Basato sulla upstart alla pagina wiki sistemd , ho usato le tabelle fornite per mappare le cose il più vicino possibile nuovo file di servizio systemd:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Questo file si trova in /home/robert/.config/systemd/user/nzbget.service . Per avviare il servizio manualmente, ho fatto:

$ systemctl --user start nzbget

Funziona alla grande. Tuttavia, quando esco dalla sessione SSH, il servizio si arresta. Inoltre, non viene avviato all'avvio o all'accesso dell'utente. Voglio che si comporti allo stesso modo di un servizio upstart: voglio che inizi all'avvio, venga eseguito costantemente e come utente specifico.

Che cosa devo fare per ottenere questa configurazione?

    
posta void.pointer 19.09.2015 - 18:17

2 risposte

97

Primo problema

Puoi specificare le direttive User= e Group= nella sezione [Service] del file di unità.

Secondo problema

Per far funzionare il servizio all'avvio, non dovresti metterlo nella tua cartella home. Invece, mettilo sotto /etc/systemd/system/ . Questa è la cartella che deve essere utilizzata dall'amministratore di sistema (ad es. Tu) per aggiungere nuovi servizi a livello di sistema.

Altre cartelle includono:

  • /usr/lib/systemd/system/ è pensato per i pacchetti che vogliono installare i file unit, sebbene in Debian e Ubuntu la cartella sia effettivamente /lib/systemd/system/ perché le varie cartelle bin e lib non sono state ancora unite in un prefisso unificato /usr/ .
  • /usr/local/systemd/system/ serve per l'installazione di unità mediante pacchetti compilati localmente.

Test dell'unità

Una volta che il file dell'unità si trova in una posizione appropriata, puoi provare ad avviare immediatamente l'unità digitando systemctl start <UNIT_FILENAME> come al solito. Dovrebbe funzionare senza dover digitare il percorso completo dell'unità. Anche l'estensione non deve essere specificata se è .service .

Abilitazione dell'unità

Prima di poter abilitare la tua unità, devi aggiungere una sezione [Install] , in base alla quale devi aggiungere la direttiva WantedBy=multi-user.target . Questa direttiva specifica la fase del processo di avvio durante il quale il servizio deve essere avviato (se abilitato). multi-user.target è appropriato per la maggior parte dei servizi.

Una volta aggiunte queste informazioni, puoi usare systemctl enable <UNIT_FILENAME> , che abilita l'unità, facendo in modo che systemd d'ora in poi lo avvii automaticamente durante l'avvio nella fase specificata.

    
risposta data Yamaho 19.09.2015 - 18:51
29

Potresti essere interessato all'uso della funzionalità "utente persistente" di systemd. È abilitato tramite loginctl enable-linger USERNAME .

Fa sì che un gestore di servizi separato per il rispettivo utente venga avviato all'avvio, quindi le unità definite dall'utente in ~/.config/systemd/user verranno rilevate ed elaborate ai tempi di avvio e di spegnimento in base alla configurazione del servizio.

Puoi anche utilizzare systemctl --user per la gestione e la configurazione dei servizi, che funzioneranno sul gestore servizi dell'utente, non su quello del sistema.

    
risposta data byteborg 11.12.2016 - 21:28

Leggi altre domande sui tag