¿Cómo puedo iniciar un servicio systemd al inicio antes de que comience otro servicio systemd?

9

Estoy ejecutando Ubuntu 16.04 en una vieja computadora portátil HP

He instalado algún software para crear un pequeño servidor plex casero. ¡He instalado sonarr, radarr, diluvio, chaqueta, etc., etc. y todos se inician automáticamente al inicio!

Hace un par de días decidí instalar rclone también y he creado (gracias a un proyecto de GitHub) un par de carpetas que deben montarse en cada inicio iniciando un script (lo inicio a través de la escritura de terminal sudo ~/bin/check.mount). Sonarr y Radarr están configurados para descargar cosas mediante diluvio a una carpeta temporal y luego exportarlas a una de estas dos carpetas montadas.

El problema es que cuando ejecuto manualmente el script Sonarr / Radarr ya está en funcionamiento y no puede encontrar sus carpetas raíz, por lo que me da un error.

Lo que me gustaría hacer es crear un mountgdrive.service (servicio, o lo que sea necesario) para iniciar automáticamente el script check.mount y, si eso no es suficiente, insertar un retraso en sonarr.service y radarr.service. ¿Es eso posible?

Escribí esto 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

y agregado a sonarr.service y radarr.service mountgdrive.serviceen el After=bit, como este

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

[Service]
User=samsepioldoresh4ze
etcetc
....

¡Pero no está funcionando! Sonarr y Radarr comienzan normalmente, ¡pero las unidades no están montadas! ¿Qué estoy haciendo mal?


Además, rtcwake no funciona en mi computadora portátil, ¡creo que es un problema del núcleo? ¿Hay alguna manera de arreglar eso?

samsepioldoloresh4ze
fuente
1
Si he entendido bien, que quiero sonarr.servicey radarr.serviceque se ejecutará después mountgdrive.servicees en servicio?
Dan
@ Dan exactamente! el problema es, la forma en que lo escribió, aparentemente mountgdrive.servicefunciona pero no hace nada (no se monta las unidades), y luego sonarr.servicey radarr.serviceejecutar normalmente debido a ubuntu ejecutadosmountgdrive.service
samsepioldoloresh4ze
1
También te recomendaría que busques en las .mountunidades . Si todo lo que mountgdrive.serviceestá haciendo es montar un directorio o similar, puede cambiarlo a un .mountservicio. Como lo hace más confiable, especialmente porque tiene dependencias de él.
Dan

Respuestas:

26

La razón por la que tiene este problema es porque está usando After=mientras también necesita Requires=o Wants=.

Hay 3 propiedades principales para administrar dependencias. Trataré de explicar brevemente la diferencia, pero puede encontrar más detalles en [Unidad] Sección Opciones | freedesktop.org

  1. After=

    Esta opción solo establece el orden de las unidades, no garantiza que el servicio haya terminado de iniciarse.

  2. Wants=

    Esta opción permite que su unidad se inicie solo después de que otra unidad haya terminado de iniciarse. (No importa si comenzó con éxito o no)

  3. Requires=

    Wants=Sin embargo, al igual que esto, su unidad se iniciará solo después de que las dependencias se hayan iniciado correctamente.

También puede usar el inverso de cada una de esas opciones.

  1. After= está invertido por Before=
  2. Wants= está invertido por WantedBy=
  3. Requires= está invertido por RequiredBy=

Para solucionar su problema, debe cambiar su servicio de montaje a:

[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

O puede agregar Wants=mountgdrive.servicea las unidades sonarr.servicey radarr.service.

Puede hacerlo sin modificar los archivos predeterminados ejecutando lo siguiente (debe hacer lo mismo para radarr.service):

systemctl edit sonarr.service

E inserte lo siguiente:

[Unit]
Wants=mountgdrive.service

Nota: Puede reemplazar Wants=con Requireso WantedBy=con RequiredBy=si no desea que los dos servicios se inicien si mountgdrive.servicefalla (aunque Wants=generalmente es suficiente e incluso se recomienda en los documentos).

EDITAR: Las opciones WantedByy RequiredBysolo se pueden usar en la [Install]sección. (Gracias @ Yankee )

Dan
fuente
gracias Wants=y WantedBy=definitivamente los usaré !! Sin embargo, recibo este error cuando reinicio el portátil i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Parece que hay un error en el script. Puedes verlo desde la línea que termina con Can't open /.config/SmokeScreen/smokescreen.conf. Quizás tengas "~ / .config / ..." en tu secuencia de comandos. Debe reemplazar la tilde ( ~) con la ruta completa, es decir /home/you_user_name/.config/....(o usar rutas relativas a su secuencia de comandos)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - este es el script check.mount, así que debería cambiar todos los $ (HOME) y $ (bindir) con las rutas completas? ¡Gracias!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Sí, $HOMEno está disponible en el momento del arranque, porque todavía no hay un usuario conectado.
Dan
Debería WantedBy=estar en la [Unit]sección? Pensé que solo podía entrar [Install].
Yankee