我正在寻找一种在OS X中定期重新启动应用程序的方法。因为这个应用程序有一个GUI我选择了LaunchAgent方法来完成它。 LaunchAgent将调用一个shell脚本,该脚本将退出应用程序(如果正在运行),然后再次打开它。
到目前为止它是有效的,唯一的例外是,一旦我的被叫shell脚本结束,启动的GUI应用程序也会退出。我尝试使用尾随“&”打开应用程序并使用nohup,但没有运气。
这是我的LaunchAgent(忽略我的愚蠢的StartCalendarInterval设置,它们只用于调试):
<?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>Label</key>
<string>com.mycompany.myapp_relauncher</string>
<key>ProgramArguments</key>
<array>
<string>/Users/xyz/Desktop/myapp_relauncher.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>21</integer>
<key>Minute</key>
<integer>25</integer>
</dict>
</dict>
</plist>
这是被调用的脚本/Users/xyz/Desktop/myapp_relauncher.sh
#!/bin/bash
function log { echo "myapp: "`date "+%Y%m%d-%H%M%S"`" $1" ; logger -t "myapp" "$1" ; }
# stopping the app if running (code ommitted here)
log "starting application now..."
nohup /Applications/myapp.app/Contents/MacOS/myapp &
log "sleeping a few seconds now..."
sleep 10 # the launched applications stays open
log "done sleeping, quitting."
# script ends, launched application ends too
答案 0 :(得分:0)
您想在此处使用disown
。这在脚本完成后无需关闭应用程序即可运行:
#!/bin/bash
/Applications/Adium.app/Contents/MacOS/Adium &
disown
这是因为使用&
只会将作业放入后台。即使它在后台,它仍然是当前脚本的子进程,当其父进程脚本完成时将被终止。通过使用disown
删除该关系并将其自行运行。
答案 1 :(得分:0)
将<key>AbandonProcessGroup</key><true/>
添加到LaunchAgent .plist;没有它,当代理(脚本)退出launchd时,“有帮助”清理所有剩余的子进程(技术上,具有相同进程组ID的任何东西),例如应用程序。
答案 2 :(得分:0)
您也可以使用open命令:
killall myapp; open -jga myapp
open -jg
通常会打开一个隐藏的应用程序,而不会提升任何窗口。例如,如果TextEdit已打开但没有打开的窗口,-jg
会创建并引发新的默认窗口。为避免这种情况,您可以测试应用程序是否已打开:
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-c</string>
<string>pgrep -x TextEdit||open -jga TextEdit</string>
</array>