Сбой на шаге EXEC порождение: нет такого файла или каталога

1

Учитывая следующий одноразовый сервис, включенный при загрузке,

[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

Это на самом деле не запускается. фильтрация/var/log/syslog

systemd [1]: myd.service: не удалось на этапе CHDIR порождать / home / foouser / my-server / bin / my: такого файла или каталога нет

Пока journalctl --unit=myd.serviceсогласен

systemd [1]: myd.service: основной процесс завершен, код = завершен, статус = 200 / CHDIR

Так, так как /home/foouser/my-server/bin/mydмягкая ссылка на шахту /home/foouser/my-server/xspyctra/xspyctrad.py, я

  1. изменено ExecStart = /home/foouser/my-server/xspyctra/xspyctrad.py
  2. прокомментировал WorkingDirectory, в котором я на самом деле не заинтересован, так как скрипт python будет делать сам os.chdir('/home/foouser/my-server/bin')по себе

Сервисы перезагружались, система перезагружалась и т. Д. Но теперь я ошеломлен следующей ошибкой

systemd [1653]: myd.service: не удалось на этапе EXEC порождение /home/foouser/my-server/xspyctra/xspyctrad.py: такого файла или каталога нет

systemd [1]: myd.service: основной процесс завершен, код = завершен, статус = 203 / EXEC

Я могу с уверенностью сказать, что этот файл существует

$ 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

В качестве последней диагностики, 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)

РЕДАКТИРОВАТЬ 1

Однако это может как-то случиться только во время загрузки. Собственно говоря,

sudo service myd stop
sudo service myd start

кажется работает, потому что 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>

Как и ожидалось. Кроме того, обратите внимание xspyctrad.py, что фактический скрипт будет порождать a twisted.reactor, следовательно, не вернется и останется на переднем плане.

Так где же может быть моя ошибка?

Патрицио Бертони
источник
1
Вы уверены, что /home/установлен, когда устройство работает при запуске? /home/foouser/Может быть, ваш зашифрован? Есть также ProtectHome=вариант, но я думаю, что если бы это была проблема, последний пример потерпел бы неудачу.
Камиль Мачоровски
Да, /home/foouser/в зашифрованном виде. Так что угадайте, лучше установить все внутри /usr/bin/...
Патрицио Бертони

Ответы:

2

Помимо перемещения исполняемых файлов в ранее доступное место (что в любом случае полезно), можно указать зависимости монтирования, чтобы сообщить systemd отложить запуск вашего модуля до тех пор, пока местоположение не будет смонтировано и доступно.

Вы можете использовать RequiresMountsFor=:

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

Или укажите Requires=/ After=на соответствующем .mountмодуле , если вы точно знаете, что нужно монтировать:

[Unit]
Requires=home-foouser.mount
After=home-foouser.mount
intelfx
источник
1

Как отметил Камил, /home/foouser/на момент начала службы не существует. Переезд в существующее местоположение закрыл проблему.

Патрицио Бертони
источник