LaunchAgent plist 在 iCloud 中找不到 AppleScript 的路径
LaunchAgent plist doesn't find path to AppleScript in iCloud
出于某种原因,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
.
实现了我自己的 Ask Different solution 变体
在 ~/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>
中给出,launchutil
的 .job
标签在 <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
脚本并重做该过程。有什么想法吗?
您要求 launchd 执行的脚本文件位于您用户的 /Library 文件夹中。
Launchd 无权访问该位置。将其移动到文件夹,例如 /usr/local/sbin
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>
出于某种原因,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>
中给出,launchutil
的 .job
标签在 <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
脚本并重做该过程。有什么想法吗?
您要求 launchd 执行的脚本文件位于您用户的 /Library 文件夹中。
Launchd 无权访问该位置。将其移动到文件夹,例如 /usr/local/sbin
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>