0

出于某种原因,Dropbox 在上线几天后终止(崩溃或退出),没有任何解释。

因此,我开始研究一种AppleScript在应用程序终止时自动重启应用程序的方法。

这让我想到了这个脚本:

repeat
    delay 120 #Run every two minutes
    tell application "System Events"
        if name of every process does not contain "Dropbox" then tell application "Dropbox" to launch
    end tell
    delay 5
end repeat

我还希望脚本在后台运行,因此我为launchctl.

~/Library/LaunchAgents/中,我创建了一个dropbox-keep-alive.plist以此内容命名的文件:

<?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>dropbox-keep-alive.job</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/Users/xxx/Library/Mobile\ Documents/com\~apple\~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

上面给出了 AppleScript 的路径,并在 下分配<array>了一个.job标签。launchutil<key>

然后我加载.plist

launchctl load -w ~/Library/LaunchAgents/dropbox-keep-alive.plist

然后启动它:

launchctl start dropbox-keep-alive.job

为了测试,我退出 Dropbox,然后等待 2 分钟以上,但没有任何反应。

如果我再试launchctl load -w一次,我会收到它已经加载的消息。launchctl start没有响应消息。

我知道 AppleScript 可以工作,因为它在osascript直接运行时可以正常工作。但是在某个地方.plist——或者我的管理launchctl——有些东西是行不通的。

我已尝试launchctl unload -w编写脚本并重做该过程。有任何想法吗?

4

2 回答 2

2

launchd 不对字符串进行 shell 样式的解析,因此脚本路径中的转义符将被解释为实际文件名的一部分......并且不会被发现。它应该看起来更像这样:

<key>ProgramArguments</key>
<array>
    <string>/usr/bin/osascript</string>
    <string>/Users/xxx/Library/Mobile Documents/com~apple~ScriptEditor2/Documents/dropbox-keep-alive.scpt</string>
</array>

我不确定这是唯一的问题,但它肯定是一个问题。如果需要进一步调试,请尝试osascript通过添加以下内容来捕获错误输出:

<key>StandardErrorPath</key>
<string>/Users/xxx/Library/Logs/dropbox-keep-alive.err</string>
于 2016-03-09T16:16:46.747 回答
1

您要求 launchd 执行的脚本文件位于用户的/Library文件夹中。

Launchd 无权访问该位置。将其移至/usr/local/sbin等文件夹

于 2016-03-09T10:21:21.007 回答