我编写了以下脚本,旨在启动守护进程并显示 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 是否正在运行的测试,该脚本将起作用。
- 如果我保留检查,但让脚本在 Zenity 窗口中显示 $JAVA 的内容而不是启动 Serviio,它就会起作用。
换句话说,我无法识别脚本中任何会阻止其运行的元素。
可能是什么问题呢?
答案1
我通过将命令的输出重定向ps
到文件找到了原因。如果我从启动器运行脚本,grep 会找到脚本本身(名称中包含“serviio”),因此它不会执行“if”内的代码。
我通过使 grep 查找的内容更加具体来修复它。
主要原因似乎是,如果脚本直接从终端运行,它不会显示为进程,但如果它从启动器运行,则解释器(在本例中为fish)会以脚本作为参数出现。