OS X LaunchAgent应该启动一个应用程序

时间:2013-12-05 13:46:46

标签: macos bash

我正在寻找一种在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

3 个答案:

答案 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>