【问题标题】:Script to check whether application is running; if not, start it检查应用程序是否正在运行的脚本;如果没有,请启动它
【发布时间】:2019-11-16 13:28:15
【问题描述】:

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

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

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

【问题讨论】:

  • 带有keepAlive 密钥的launchd 代理可能是更好的选择。

标签: bash macos shell variable-assignment quotes


【解决方案1】:

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

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

有人发现它有潜在的问题吗?

感谢您的建议。

霍华德

【讨论】:

  • 这可能不是问题,但是为什么选择直接调用它的可执行文件(.app/Contents/MacOS/...)来打开应用程序而不是open -a appname.app
【解决方案2】:

watershed util(在基于 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 上关闭 mc,在 B 上我们将看到 mc 的新实例,而在 C 上 watershed mc 仍在等待。现在关闭 B 上的 mc,然后 C 显示命令提示符——第三个实例无用地等待。另一方面,如果我们一直等到在 A 上关闭 mc然后在 C 上运行 watershed mc,然后在 B 上关闭 mc,然后 mc 将在 C 上。两个实例工作正常。

【讨论】:

    【解决方案3】:

    我建议使用pgrep 来检查进程是否没有(!)运行:

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

    见:man pgrep

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 2018-04-25
      • 2016-05-06
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多