
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 が systemd サービスによって処理されていないため、何らかの理由で必要な実行可能ファイルにアクセスできない (または $PATH が更新されない) ことにあると思います。
これをテストするには、エラー ブロック内で $PATH をエコー出力し、それが見つからない場合は、systemd サービス ファイル内の環境変数に直接追加します。
[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
この方法では、パスはスクリプトの実行中にのみ更新され、変更されることを予期していないユーザーのパスには変更が加えられません。