我在Mac上运行应用程序“ OsiriX MD”。有时它莫名其妙地“退出”。我想每小时运行一个脚本来检查它是否正在运行。如果没有,我想重新启动它。这行得通吗?
#!/bin/bash
PROCESS=OsiriX MD
number=$(ps aux | grep $PROCESS | wc -l)
if [ $number -gt 0 ]
then
open $PROCESS;
fi
答案 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
有人看到它的潜在问题吗?
感谢您的建议。
霍华德