私はデーモンを起動し、Zenityウィンドウを表示し、ウィンドウが閉じたときにデーモンを停止するように設計された次のスクリプトを作成しました。
#!/usr/bin/fish
if not ps aux | grep [s]erviio > /dev/null
set -x JAVA "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"
~/Programs/serviio/bin/serviio.sh &
zenity --info --text="Serviio is running.\nClick OK to stop." --title="Serviio"
~/Programs/serviio/bin/serviio.sh -stop
end
端末でスクリプトを実行すると正常に動作します。また、bash端末でも実行されますが、これはShebangが期待どおりに動作していることを示すようです。
ただし、スクリプトを指すようにランチャーを作成して実行しようとすると、何も起こりません。 Serviioが起動せず(確認できますps aux
)、Zenityウィンドウは表示されません。
スクリプトに問題を引き起こす原因は何かを調べようとしましたが、成功しませんでした。
- Serviioが実行されているかどうかテストを削除すると、スクリプトは機能します。
- 確認を維持しましたが、スクリプトがServiioを起動するのではなく、Zenityウィンドウに$ JAVAの内容を表示させるようにすると機能します。
つまり、スクリプトの実行を妨げる要素をスクリプトで識別できません。
何が問題なのでしょうか?
答え1
コマンド出力をファイルにリダイレクトしてps
原因を見つけました。ランチャーでスクリプトを実行すると、grepはスクリプト自体(名前に "serviio"を含む)を探すので、 "if"内のコードを実行しません。
grepがより具体的に探しているものを作成して問題を解決しました。
主な理由は、スクリプトを端末で直接実行するとプロセスとしては表示されませんが、ランチャーで実行するとスクリプトを引数としてインタプリタ(この場合はフィッシュ)が表示されるためです。 。