Come posso avviare un servizio systemd all'avvio prima dell'avvio di un altro servizio systemd?


9

Sto eseguendo Ubuntu 16.04 su un vecchio laptop HP

Ho installato del software su di esso per creare un piccolo server plex casalingo. Ho installato Sonarr, Radarr, Diluvio, Jackett, ecc. Ecc. E si avviano automaticamente all'avvio!

Un paio di giorni fa ho deciso di installare anche rclone e ho creato (grazie a un progetto GitHub) un paio di cartelle che devono essere montate ad ogni avvio avviando uno script (lo lancio tramite scrittura terminale sudo ~/bin/check.mount). Sonarr e Radarr sono impostati per scaricare roba tramite diluvio in una cartella temporanea e quindi esportarla in una di queste due cartelle montate.

Il problema è che, quando avvio manualmente, gli script Sonarr / Radarr sono già attivi e non riescono a trovare le loro cartelle principali, quindi mi danno un errore.

Quello che mi piacerebbe fare è creare un mountgdrive.service (servizio o quant'altro necessario) per avviare automaticamente lo script check.mount e, se ciò non bastasse, inserire un ritardo in sonarr.service e radarr.service! È possibile?

Ho scritto questo con sudo nano /etc/systemd/system/mountgdrive.service

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

e aggiunto a sonarr.service e radarr.service mountgdrive.servicenel After=bit, in questo modo

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

Ma non funziona! Sonarr e Radarr si avviano normalmente, ma le unità non sono montate! Che cosa sto facendo di sbagliato?


Inoltre, rtcwake non funziona sul mio laptop - penso che sia un problema del kernel ?! C'è un modo per risolvere questo?


1
Se ho capito bene, vuoi sonarr.serviceed radarr.serviceessere eseguito dopo che mountgdrive.serviceè attivo e funzionante?
Dan

@ Dan esattamente! il problema è il modo in cui ho scritto che a quanto pare mountgdrive.servicefunziona, ma non fa nulla (non montare le unità), e poi sonarr.servicee radarr.servicegestito normalmente perché ubuntu giustiziatimountgdrive.service
samsepioldoloresh4ze

1
Vorrei anche raccomandare di esaminare le .mountunità . Se tutto mountgdrive.serviceciò che stai facendo è montare una directory o simile, potresti essere in grado di cambiarlo in un .mountservizio. Come lo rende più affidabile soprattutto perché hai dipendenze da esso.
Dan

Risposte:


26

Il motivo per cui si riscontra questo problema è perché si utilizza anche After=quando è necessario Requires=o Wants=.

Esistono 3 proprietà principali per la gestione delle dipendenze. Proverò a spiegare brevemente la differenza ma puoi trovare maggiori dettagli nella sezione Opzioni [Unità] | freedesktop.org

  1. After=

    Questa opzione imposta solo l'ordine delle unità, non garantisce che il servizio abbia terminato l'avvio.

  2. Wants=

    Questa opzione consente all'unità di avviarsi solo dopo che un'altra unità ha terminato l'avvio. (Non importa se è stato avviato correttamente o meno)

  3. Requires=

    Proprio come Wants=, tuttavia, questo farà avviare l'unità solo dopo che le dipendenze sono state avviate correttamente.

Puoi anche usare l'inverso di ciascuna di queste opzioni.

  1. After= è inverso da Before=
  2. Wants= è inverso da WantedBy=
  3. Requires= è inverso da RequiredBy=

Per risolvere il problema, è necessario modificare il servizio di montaggio in:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target sonarr.service radarr.service

Oppure puoi aggiungere Wants=mountgdrive.servicealle unità sonarr.servicee radarr.service.

Puoi farlo senza modificare i file predefiniti eseguendo quanto segue (devi fare lo stesso per radarr.service):

systemctl edit sonarr.service

E inserisci quanto segue:

[Unit]
Wants=mountgdrive.service

Nota: è possibile sostituire Wants=con Requireso WantedBy=con RequiredBy=se non si desidera che i due servizi vengano avviati in caso di mountgdrive.serviceesito negativo (sebbene di Wants=solito sia sufficiente e persino consigliato nei documenti).

EDIT: le opzioni WantedBye RequiredBypossono essere utilizzate solo nella [Install]sezione. (Grazie @Yankee )


grazie per Wants=e WantedBy=, li userò sicuramente !! Ottengo questo errore quando riavvio il laptop i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
Sembra esserci un errore nello script. Puoi vederlo dalla linea che termina con Can't open /.config/SmokeScreen/smokescreen.conf. Forse hai "~ / .config / ..." nello script yoru. Dovresti sostituire la tilde ( ~) con il percorso completo, ovvero /home/you_user_name/.config/....(o utilizzare i percorsi relativi alla tua sceneggiatura)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - questo è lo script check.mount, quindi dovrei cambiare tutti i $ (HOME) e $ (bindir) con i percorsi completi? Grazie!
samsepioldoloresh4ze,

1
@ samsepioldoloresh4ze Sì, $HOMEnon è disponibile al momento dell'avvio, perché non c'è ancora un utente connesso.
Dan

Dovrebbe WantedBy=essere nella [Unit]sezione? Ho pensato che potesse solo entrare [Install].
Yankee,
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.