检查应用程序是否正在运行的脚本;如果没有,请启动它

时间:2019-07-06 03:44:40

标签: bash macos shell variable-assignment quotes

我在Mac上运行应用程序“ OsiriX MD”。有时它莫名其妙地“退出”。我想每小时运行一个脚本来检查它是否正在运行。如果没有,我想重新启动它。这行得通吗?

#!/bin/bash
PROCESS=OsiriX MD
number=$(ps aux | grep $PROCESS | wc -l)

if [ $number -gt 0 ]
then
    open $PROCESS;
fi

3 个答案:

答案 0 :(得分:1)

我建议使用pgrep检查进程是否未(!)正在运行:

process="OsiriX MD"
if ! pgrep -f "$process"; then
  echo "start application"
fi

请参阅:man pgrep

答案 1 :(得分:0)

watershed实用程序(在基于 Debian 的发行版中,它与apt install watershed一起安装)可能有用。

  

说明:减少idempotent命令的多余执行
     分水岭可能围绕命令运行,以便任何进一步的尝试
     在另一个副本运行时运行命令只会导致一个副本
     初步的进一步尝试。

要使用它,第一个实例(以及所有其他尝试)应以类似以下内容的开头:

watershed "OsiriX MD" &

或者如果OsiriX MD需要终端本身:

watershed "OsiriX MD"

这将在~/.watershed/中保存一个特殊的锁定文件,以后将检查watershed。如果OsiriX MD仍在运行,watershed将等到运行,然后运行它。如果OsiriX MD没有运行,那么watershed将运行它。

一个明显的错误:第三个​​实例似乎被忽略了。例如,假设我们在终端A上运行watershed mc,然后在终端B上运行,然后在终端C上运行。我们将在A上看到mc,在B&C上看到watershed mc都在等待。现在在A和B上关闭mc,在B上我们看到一个新实例mc,在C上,watershed mc仍在等待。现在关闭B上的mc,C显示命令提示符-第三个实例无用地等待着。另一方面,如果我们一直等到在A上关闭mc,然后然后在C上运行watershed mc,然后在B上关闭mc,则mc会在C上。两个实例工作正常。

答案 2 :(得分:0)

到目前为止,我已经成功使用了以下代码:

#!/bin/bash process="OsiriX\ MD" if ! pgrep -f "$process"; then open -a /Applications/OsiriX\ MD.app/Contents/MacOS/OsiriX\ MD; fi

有人看到它的潜在问题吗?

感谢您的建议。

霍华德