Google 드라이브를 마운트하는 사용자 정의 스크립트가 있습니다.
이 스크립트의 일부는 다음 코드입니다.
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사용자 및 루트에서 유효한 경로를 제공합니다.
$ 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
솔루션을 제공해 주셔서 감사합니다. 각각은 나에게 중요하고 도움이 됩니다. 다시 한 번 새로운 것을 배웠습니다. 결국 나는 opam을 통해 대신 deb에서 google-drive-ocamlfuse를 설치하기로 결정했습니다. 모든 사용자가 사용할 수 있는 경로에 gdo를 설치하는 것이 좋습니다. 이로 인해 $PATH의 추가 구성이 필요하지 않습니다.
답변4
메모:나는 이 답변을 '있는 그대로' 두었지만 관련된 유일한 부분은 스크립트에서 직접가 아닌 서비스 파일을 통해 환경을 설정하는 방법입니다. 스크립트 실행이 완료된 후에는 스크립트에서 새 $PATH 설정이 유지되지 않습니다.
$PATH
다른 답변과 관련하여 실제로 올바른 사용자가 실행하면 작동하는 스크립트를 편집하여 오염시키지 마십시오 . 스크립트에서 직접 편집해야 하는 경우 원본 $PATH
.
문제는 /etc/profile이 시스템 서비스에 의해 처리되지 않아서 어떤 이유로든 필요한 실행 파일에 대한 액세스(또는 업데이트된 $PATH)를 얻지 못했다는 사실에 있다고 생각합니다.
이를 테스트하려면 오류 블록 내에서 $PATH를 출력할 수 있으며, 누락된 경우 systemd 서비스 파일 내의 환경 변수에 직접 추가할 수 있습니다.
[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
이렇게 하면 스크립트가 실행되는 동안에만 경로가 업데이트되고, 수정될 것으로 예상하지 않는 사용자에 대해서는 경로가 수정되지 않습니다.