Linux サービスとしての Bash スクリプトは実行されませんが、ターミナルから実行すると正常に動作します。

Linux サービスとしての Bash スクリプトは実行されませんが、ターミナルから実行すると正常に動作します。

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標準には含まれていないことです。PATHsystemd

スクリプトの先頭に次のような行を追加するだけです。

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

この方法では、パスはスクリプトの実行中にのみ更新され、変更されることを予期していないユーザーのパスには変更が加えられません。

関連情報