Учитывая следующий одноразовый сервис, включенный при загрузке,
[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
, я
- изменено
ExecStart = /home/foouser/my-server/xspyctra/xspyctrad.py
- прокомментировал 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
, следовательно, не вернется и останется на переднем плане.
Так где же может быть моя ошибка?
/home/
установлен, когда устройство работает при запуске?/home/foouser/
Может быть, ваш зашифрован? Есть такжеProtectHome=
вариант, но я думаю, что если бы это была проблема, последний пример потерпел бы неудачу./home/foouser/
в зашифрованном виде. Так что угадайте, лучше установить все внутри/usr/bin/
...Ответы:
Помимо перемещения исполняемых файлов в ранее доступное место (что в любом случае полезно), можно указать зависимости монтирования, чтобы сообщить systemd отложить запуск вашего модуля до тех пор, пока местоположение не будет смонтировано и доступно.
Вы можете использовать
RequiresMountsFor=
:Или укажите
Requires=
/After=
на соответствующем.mount
модуле , если вы точно знаете, что нужно монтировать:источник
Как отметил Камил,
/home/foouser/
на момент начала службы не существует. Переезд в существующее местоположение закрыл проблему.источник