关于如何使程序保持活动有很多提示,并在程序崩溃时重新启动它们:
他们都有一个共同的限制:他们都需要在之前运行待监控程序。
在我的情况下,我有一个不露面的后台应用程序,它必须自己决定是否要重新启动它以防它崩溃。因此,我的应用程序将首先启动 ,并且无法退出成为监控过程的子项(有关解释,请参见下文)。
我通过编写这样的plist文件尝试了launchd
解决方案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>com.mydomain.myapp.restartAfterCrash</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/MyApp.app/Contents/MacOS/MyApp</string>
</array>
</dict>
</plist>
它几乎可以满足我的需求,但为了从我的应用程序激活它,通过launchctl load /path/to/file.plist
调用它,它想再次启动我的应用程序,以便我原来运行的应用程序必须退出到让新实例运行。
但是,我无法将控制权传递给我的应用程序的另一个实例,因为如果通过双击Finder文档启动应用程序,或者如果它是由想要与我的应用程序进一步通信的AppleScript启动,则会导致几个新问题。在这些情况下,我最初启动的应用必须继续运行,因此launchd
方法不可行,也不需要我的应用运行新实例的任何其他方法。
简而言之,Mac应用程序可以使用其他经过测试(可靠)的方法,只有在崩溃时才能重新启动吗?
我能想到的唯一方法是启动另一个不露面的后台应用程序来监控第一个程序的生命周期,例如:通过它的PID。
我也想知道是否可以使用简单的shell命令调用来定期检查我的应用程序是否还活着,因为那些总是作为子进程运行并且会与主应用程序一起死掉,不是吗?