Falha na etapa de desova do EXEC: nenhum arquivo ou diretório

0

Dado o seguinte serviço one-shot, ativado na inicialização,

[Unit]

Description = My Server Daemon
Documentation = https://etcetc.org

Wants = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service
After = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service

[Service]

Type = oneshot

RemainAfterExit = yes

User = foouser

PIDFile = /run/myd.pid

WorkingDirectory = /home/foouser/my-server/bin

ExecStart = /home/foouser/my-server/bin/myd
ExecStop = /home/foouser/my-server/bin/abort.sh

TimeoutStopSec = 5

[Install]

WantedBy = multi-user.target

Na verdade, não consegue começar. Filtrando /var/log/syslog

systemd[1]: myd.service: Failed at step CHDIR spawning /home/foouser/my-server/bin/my: No such file or directory

Enquanto journalctl --unit=myd.service concorda

systemd[1]: myd.service: Main process exited, code=exited, status=200/CHDIR

Então, como /home/foouser/my-server/bin/myd é um link meu para /home/foouser/my-server/xspyctra/xspyctrad.py ,

  1. alterou ExecStart = /home/foouser/my-server/xspyctra/xspyctrad.py
  2. comentou WorkingDirectory em que não estou realmente interessado, pois o script python fará um os.chdir('/home/foouser/my-server/bin') por conta própria

Serviços recarregados, sistema reinicializado, etc. Mas agora estou atordoado com o seguinte erro

systemd[1653]: myd.service: Failed at step EXEC spawning /home/foouser/my-server/xspyctra/xspyctrad.py: No such file or directory

systemd[1]: myd.service: Main process exited, code=exited, status=203/EXEC

Eu posso garantir com certeza que esse arquivo existe

$ ls -l /home/foouser/my-server/xspyctra/xspyctrad.py
-rwxrw-r-- 1 foouser foouser 5532 May 10 16:13 /home/foouser/my-server/xspyctra/xspyctrad.py

Como último diagnóstico, service myd status

● myd.service - My Server Daemon
  Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since Fri 2018-05-11 10:58:21 CEST; 16min ago
  Docs: https://etcetc.org
  Main PID: 1627 (code=exited, status=203/EXEC)

EDIT 1

No entanto, isso pode acontecer de alguma forma apenas durante o tempo de inicialização. De fato,

sudo service myd stop
sudo service myd start

parece funcionar, porque service myd status

● myd.service - My Server Daemon
     Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2018-05-11 11:22:52 CEST; 1min 16s ago
       Docs: https://etcetc.org
   Main PID: 2106 (python2)
      Tasks: 24
     Memory: 545.1M
        CPU: 10.913s
     CGroup: /system.slice/myd.service
       ├─2106 python2 /home/foouser/my-server/bin/myd
       ├─2122 ./<my-child-process-a>
       ├─2127 ./<my-child-process-b>
       └─2133 ./<my-child-process-c>

Como esperado. Além disso, observe que xspyctrad.py , o script real, gerará twisted.reactor , portanto, não retornará e permanecerá em primeiro plano.

Então, onde poderia estar errado?

    
por Patrizio Bertoni 11.05.2018 / 11:32

2 respostas

1

Além de mover executáveis para um local acessível antecipadamente (o que é bom fazer uma coisa), é possível especificar dependências de montagem para informar ao systemd para atrasar a inicialização de sua unidade até que o local seja montado e esteja disponível.

Você pode usar RequiresMountsFor= :

[Unit]
RequiresMountsFor=/home/foouser/my-server/bin

Ou especifique Requires= / After= em um .mount unit , se você sabe exatamente o que precisa ser montado:

[Unit]
Requires=home-foouser.mount
After=home-foouser.mount
    
por 12.05.2018 / 10:20
1

Como Kamil apontou, /home/foouser/ não existe no momento em que o serviço foi iniciado. Mover para um local existente fechou o problema.

    
por 11.05.2018 / 17:09