创建一个将执行程序的Bash脚本,如果该脚本退出而没有崩溃,将再次运行它


8

我想知道最简单的创建bash脚本的方法,该脚本将在MacOSX中运行一个应用程序(这是一个基于UNIX的系统,因此我认为这是正确的地方)。等待程序退出。如果退出不是崩溃,请再次运行。否则,请打开崩溃报告窗口并退出。

我希望此脚本可以永久运行,直到崩溃或手动终止。

我有一个模糊的想法,但不确定。这是我到目前为止的内容:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi

您几乎绝对不希望出于任何原因永远运行脚本。您希望服务守护程序永远运行。我不知道他们是如何在Apple上做到这一点的,但是您可能应该更仔细地看一下init系统,以了解是否有任何方法可以向其注册服务。通常,守护程序会定期自我执行以更新/保存状态-实际上,它们不会永远循环。
mikeserv

Answers:


12

这是Bash while循环的作用:

while /path/to/application.app
do
    :
done

它将运行该应用程序,如果成功终止,则运行循环主体。:shell的no-op命令(循环必须有一个body,所以这就是我们放置的对象);之后,它会回到顶部并再次运行该程序。如果失败,则循环停止运行,脚本退出。

但是,看起来您正在运行的可能是普通的Mac应用程序(.app):在这种情况下,存在一些问题。一种是您需要使用open命令,而不是直接运行应用程序目录:open /path/to/application.app

另一个是,当您这样做open时,通常会立即成功终止,而不管应用程序继续做什么:这不是绝对通用的,但是大多数都会。如果您愿意,则可以使用-W选项强制open阻止,直到应用程序结束:open -W /path/to/application.app。请注意,如果应用程序已经在运行,它将等待直到现有执行也终止。

一个问题的多少取决于您正在运行的应用程序。如果效果不佳,那么从外壳执行此操作可能不是最佳选择。在这种情况下,最好使用AppleScript,您可以在Ask Different询问


我在Mac上安装了一个应用,该应用可能会故意崩溃,因此我测试了您的上述解决方案。即使崩溃,它也会自动重新启动应用程序。有没有办法检查应用程序的退出?因为打开显然会以0退出终止,所以无论如何都会再次运行。
Ben疯狂登上Euden,2014年

@BenCrazedUpEuden:我的理解是,open对于某些启动错误,它只会返回失败。应用程序是由系统服务启动的,而不是直接启动的,因此没有直接的通信渠道。有时可以直接启动应用程序可执行文件:/Applications/YourProgram.app/Contents/MacOS/YourProgram。否则,我们会从Unix移到其他地方,您会在Ask Different上得到更好的答案。您可以使用osascript
Michael Homer

0

我已经测试过了:

#!/bin/bash
while <your_cmd_here>
do
    true
done

这可以通过测试POSIX样式的命令的返回码来实现。0表示确定,其他任何情况都可以视为错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.