Вопрос: Служба Systemd, рабочий каталог не меняет каталог


Я создал этот скрипт:

[Unit]
Description=test

[Service]
WorkingDirectory=/home/someuser
ExecStart=/somescript.sh

Restart=always
RestartSec=10

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=autodeploy

Environment=NODE_ENV=production PORT=1494

[Install]
WantedBy=multi-user.target

Но когда я его запускаю, он говорит:

Process: 8986 ExecStart=/somescript.sh (code=exited, status=203/EXEC)

Я понял, что это сообщение означает, что скрипт не будет найден ... Почему рабочий каталог не работает для меня?

Благодарю.


0
2017-08-07 09:45


Источник


Eсть / перед somescript.sh, Я не думаю, что вы положили somescript.sh в корне файловой системы? - zwets
Я положил его внутрь /home/someuser, Его нужно запустить в этом каталоге. Я попытался сделать это с помощью WorkingDirectory но он не может найти скрипт. - Roi Amiel
Если вы положите его /home/someuser, затем сообщите системе, что он есть. Посмотрите внимательно на ExecStart=/somescript.sh: где это говорит сценарий? (Подсказка: где /home располагается?) - zwets
Мне нужна служба, чтобы запустить ее из исходного каталога только (/home/someuser/somescript.sh не будет работать для меня), я попытался использовать WorkingDirectory для изменения каталога перед его выполнением. У вас есть идея, как я могу это сделать? - Roi Amiel
Я действительно не понимаю, чего вы хотите? Это работает: ExecStart=/home/someuser/somescript.sh и это способ сделать это; в противном случае может возникнуть другая ошибка, не связанная с сервисом. - Rinzwind


Ответы:


Системаd WorkingDirectory= установка определяет, в какой директории служба будет запущена, так же, как при использовании cd для изменения каталога, когда вы работаете в оболочке.

Это не означает, что все другие пути (в том числе из ExecStart=) теперь будет относиться к нему, поэтому вам все равно нужно полностью указать путь к вашему скрипту в этой директиве:

ExecStart=/home/someuser/somescript.sh

Возможно, вы думали о RootDirectory= директива вместо? Этот каталог использует chroot команду для переключения корня файловой системы, видимого процессом, по указанному вами каталогу, поэтому из вашего использования / для расположения сценария, похоже, возможно, что вы хотели ... Однако, используя RootDirectory= требует, чтобы у вас был системный образ, с его бинарниками и библиотеками. Например, вам нужно иметь /bin/sh для запуска вашего сценария оболочки и /lib с libc и т. д. Обычно вы не можете просто использовать RootDirectory= почти любой каталог, который вам нравится ...

Поэтому мой совет здесь, чтобы исправить проблему, которую вы видите, - это просто обновить ExecStart= чтобы указать полный путь к вашему скрипту.


3
2017-08-08 04:46