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

9

Estou executando o Ubuntu 16.04 em um laptop HP antigo

Instalei algum software para criar um pequeno servidor plex caseiro. Eu instalei o sonarr, o radarr, o dilúvio, o 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 devem ser montadas em cada inicialização iniciando um script (eu o inicio por meio da escrita do terminal sudo ~/bin/check.mount). Sonarr e Radarr são configurados para baixar coisas via diluge para uma pasta temporária e depois exportá-las para uma dessas duas pastas montadas.

O problema é que, no momento em que inicio manualmente o script, o Sonarr / Radarr já está em execução e não consegue encontrar suas pastas raiz, portanto, 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 no sonarr.service e radarr.service! Isso é possível?

Eu escrevi isso com 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 adicionado a sonarr.service e radarr.service mountgdrive.serviceno After=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 de kernel ?! Existe uma maneira de consertar isso?

samsepioldoloresh4ze
fonte
1
Se bem entendi, você deseja sonarr.servicee radarr.serviceserá executado depois de mountgdrive.serviceinstalado e funcionando?
21418 Dan
@ Dan exatamente! o problema é, a forma como eu escrevi isso aparentemente mountgdrive.servicefunciona mas não faz nada (não montar as unidades) e, em seguida, sonarr.servicee radarr.servicefuncionar normalmente porque ubuntu executadomountgdrive.service
samsepioldoloresh4ze
1
Eu também recomendaria que você olhasse para as .mountunidades . Se tudo o que você mountgdrive.serviceestá fazendo é montar um diretório ou similar, você poderá alterá-lo para um .mountserviço. Como o torna mais confiável, especialmente porque você tem dependências.
Dan

Respostas:

26

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

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

  1. After=

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

  2. Wants=

    Esta opção permite que a sua unidade inicie somente após a conclusão da inicialização de outra unidade. (Não importa se foi iniciado com êxito 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 inverso 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 o serviço de montagem para:

[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

Ou você pode adicionar Wants=mountgdrive.serviceàs unidades sonarr.servicee 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

Nota: Você pode substituir Wants=por Requiresou WantedBy=com RequiredBy=se não desejar que os dois serviços iniciem se mountgdrive.servicefalharem (embora Wants=seja geralmente suficiente e até recomendado nos documentos).

EDIT: As opções WantedBye RequiredBysó podem ser usadas na [Install]seção. (Obrigado @Yankee )

Dan
fonte
obrigado por Wants=e WantedBy=, eu definitivamente vou usá-los! Eu recebo este erro embora quando eu reiniciar o laptop i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Parece haver um erro no script. Você pode vê-lo a partir da linha que termina com Can't open /.config/SmokeScreen/smokescreen.conf. Talvez você tenha "~ / .config / ..." no script yoru. Você deve substituir o til ( ~) com o caminho completo ie /home/you_user_name/.config/....(Ou usar caminhos relativos ao seu script)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - este é o script check.mount, então devo alterar todos os $ (HOME) e $ (bindir) pelos caminhos completos? Obrigado!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Sim, $HOMEnão está disponível no momento da inicialização, porque ainda não há um usuário conectado.
Dan
Deve WantedBy=estar na [Unit]seção? Eu pensei que só poderia entrar [Install].
Yankee