Bash-скрипт как linux-service не запускается, но запуск из терминала работает отлично

Bash-скрипт как linux-service не запускается, но запуск из терминала работает отлично

У меня есть собственный скрипт для монтирования Google Drives.
Часть этого скрипта — следующий код:

if [ ! "$(which google-drive-ocamlfuse)" ]
then
    echo "Install google-drive-ocamlfuse first!"
    exit 1
fi

Выполнено из терминала, работает как часы.
Итак, я настроил его как службу:

[Unit]
Description=Mount and umount google drives

[Service]
User=<usernamehere>
Type=oneshot
RemainAfterExit=true
ExecStart=/home/<usernamehere>/mybscripts/gdrivemounter.sh -m
ExecStop=/home/<usernamehere>/mybscripts/gdrivemounter.sh -u
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/<usernamehere>/.Xauthority"

[Install]
WantedBy=graphical.target

К сожалению, при проверке статуса службы я вижу код выхода: «Сначала установите google-drive-ocamlfuse!».

Командакоторый google-drive-ocamlfuseпод пользователем и root дает мне правильный путь:

$ which google-drive-ocamlfuse
/home/<usernamehere>/.opam/default/bin/google-drive-ocamlfuse

В чем проблема?

решение1

Проблема в том, что когда скрипт запускается как служба, он не запускается как "вы": у него нет вашей среды. А именно, у него нет вашей PATHпеременной.

Либо добавьте /home/<usernamehere>/.opam/default/binPATH в свой скрипт, либо просто жестко закодируйте полный путь для этой программы.

решение2

Наиболее вероятная причина в том, что каталог, содержащий файл, google-drive-ocamlfuseнаходится в PATHоболочке вашего входа, но не в стандарте, PATHиспользуемом systemd.

Просто добавьте такую ​​строку в начало вашего скрипта:

PATH=$PATH:/path/to/google-drive-ocamlfuse

решение3

Спасибо всем за решения. Каждое для меня важно и полезно - снова узнал что-то новое. В итоге решил установить google-drive-ocamlfuse из deb, а не через opam. Лучше установить gdo в путь, доступный всем пользователям. Благодаря этому дополнительная настройка $PATH не нужна.

решение4

Примечание:Я оставил этот ответ "как есть", но единственная важная часть - как задать среду через файл службы, а не напрямую в скрипте. Установка нового $PATH в скрипте не сохранится после завершения работы скрипта.

В отношении других ответов, пожалуйста, не загрязняйте свой, $PATHредактируя свой скрипт, когда на самом деле он работает, если запущен правильным пользователем. Если вам нужно редактировать его непосредственно в скрипте, верните его обратно, восстановив оригинальный $PATH.

Я думаю, проблема заключается в том, что /etc/profile не обрабатывается службами systemd, и поэтому по какой-то причине не получил доступа (или обновленного $PATH) для требуемого исполняемого файла.

Чтобы проверить это, вы можете вывести $PATH в блоке ошибок, и если он отсутствует, то добавить его непосредственно в переменную окружения в файле службы systemd:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Таким образом, путь обновляется только для скрипта во время его выполнения, он не изменяется для пользователей, которые могут не ожидать его изменения.

Связанный контент