Como posso iniciar um serviço do systemd na inicialização antes de iniciar outro serviço do systemd?

8

Estou executando o Ubuntu 16.04 em um antigo laptop HP

Instalei alguns softwares nele para criar um pequeno servidor plex caseiro. Eu instalei sonarr, radarr, dilúvio, jackett, etc etc e todos eles são iniciados automaticamente na inicialização!

Alguns dias atrás eu decidi instalar o rclone também e criei (graças a um projeto do GitHub) algumas pastas que precisam ser montadas em cada inicialização com o lançamento de um script (eu o inicio via terminal escrevendo% código%). Sonarr e Radarr são configurados para fazer o download de material via dilúvio para uma pasta temporária e, em seguida, exportá-lo para uma dessas duas pastas montadas.

O problema é que, quando eu inicio o script manualmente, o Sonarr / Radarr já está funcionando e não consegue encontrar suas pastas raiz, então eles me dão um erro.

O que eu gostaria de fazer é criar um mountgdrive.service (serviço, ou o que for necessário) para iniciar automaticamente o script check.mount e, se isso não for suficiente, inserir um atraso em sonarr.service e radarr.service ! Isso é possível?

Eu escrevi isso com sudo ~/bin/check.mount

[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 adicionado a sonarr.service e radarr.service sudo nano /etc/systemd/system/mountgdrive.service no mountgdrive.service bit, como este

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

[Service]
User=samsepioldoresh4ze
etcetc
....

Mas não está funcionando! Sonarr e Radarr começam normalmente, mas as unidades não estão montadas! O que estou fazendo errado?

Além disso, o rtcwake não funciona no meu laptop - acho que é um problema no kernel ?! Existe uma maneira de corrigir isso?

    
por samsepioldoloresh4ze 14.04.2018 / 09:18

1 resposta

21

O motivo pelo qual você está tendo este problema é porque você está usando After= , enquanto também precisa de Requires= ou Wants= .

Existem 3 propriedades principais para gerenciar dependências. Vou tentar explicar brevemente a diferença, mas você pode encontrar mais detalhes em Opções da Seção [Unidade] | freedesktop.org

  1. After=

    Esta opção apenas define a ordem das unidades, não garante que o serviço tenha terminado de iniciar.

  2. Wants=

    Esta opção permite que sua unidade inicie somente após o término de outra unidade. (Não importa se começou com sucesso ou não)

  3. Requires=

    Assim como Wants= , no entanto, isso fará com que sua unidade inicie somente depois que as dependências forem iniciadas com êxito.

Você também pode usar o inversa de cada uma dessas opções.

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

Para corrigir seu problema, você precisa alterar seu serviço de montagem para:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service
WantedBy=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

Ou você pode adicionar Wants=mountgdrive.service às unidades sonarr.service e radarr.service .

Você pode fazer isso sem modificar os arquivos padrão executando o seguinte (você precisa fazer o mesmo para radarr.service ):

systemctl edit sonarr.service

E insira o seguinte:

[Unit]
Wants=mountgdrive.service

Observação: você pode substituir Wants= por Requires ou WantedBy= por RequiredBy= se não quiser que os dois serviços sejam iniciados se mountgdrive.service falhar (embora Wants= seja geralmente suficiente e mesmo recomendado nos docs).

    
por Dan 14.04.2018 / 09:54