У меня есть собственный скрипт для монтирования 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/bin
PATH в свой скрипт, либо просто жестко закодируйте полный путь для этой программы.
решение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
Таким образом, путь обновляется только для скрипта во время его выполнения, он не изменяется для пользователей, которые могут не ожидать его изменения.