【问题标题】:OSX (10.7.5) /Library/LaunchDaemons/ plist not runningOSX (10.7.5) /Library/LaunchDaemons/ plist 未运行
【发布时间】:2014-01-26 03:07:34
【问题描述】:

我对 OSX shell 编程非常陌生(所以要温柔)但是我是计算机科学专业的毕业生(尽管 15 年前!)所以围绕 unix 系统进行编程对我来说并不是什么新鲜事。

我一直想知道为什么我在 /Library/LaunchDaemons/ 中的 plist 没有运行。我花了半天的时间来追寻那些没有去任何地方的松散的东西,因此我在这里发帖给你们这些好人。

下面是我非常简单的 plist。请注意,“MyApp”只是一个苹果脚本,(目前)只是通过 shell 命令“killall”终止并重新加载特定的应用程序。这部分工作得很好(即,当我在查找器中双击它时,所需的应用程序确实会终止并重新加载,并且当我单击“编译”和“运行”时也可以从 AppleScript 编辑器中)。仅供参考,我还设置了这个applescript,现在每次调用它时都会将时间/日期戳写入日志文件,以便在调用它时让我清楚......

....而且它永远不会自动发生!
我唯一可以让它运行的时候是我:
a) 在 finder 中双击 MyApp。
b) 从 applescript 编辑器中“运行”它
c) 命令提示符:'launchctl start MyApp'
我通过我的日志文件上的“tail -f”确认脚本确实由上述任何一个运行,并密切关注控制台输出.....

然而,我真正想要的是:
d) 让它在启动时自动运行,然后每隔一小时调用一次。

这是我的 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>MyApp</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/MyApp.app/Contents/MacOS/applet</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
    <key>WorkingDirectory</key>
    <string>/Applications/MyApp.app/Contents/MacOS/</string>
</dict>
</plist>

这里是目录权限

iMac:LaunchDaemons keiran_harris$ ls -las
total 24
 0 drwxr-xr-x   5 root  wheel   170 25 Jan 19:38 .
 0 drwxr-xr-x+ 64 root  wheel  2176 24 Jan 12:19 ..
16 -r--r--r--@  1 root  wheel   732 26 Jan 13:32 MyApp.plist

有人知道我到底做错了什么吗?
我会很感激的。
提前感谢大师!
基兰。

PS> 已在此论坛中仔细检查了其他类似问题,但无济于事:
VERY simple Launchd plist not running my script
launchd file runs manually but not automatically
My mac osx launched plist won't run

【问题讨论】:

    标签: macos plist launchd


    【解决方案1】:

    AppleScripts 只能作为 Aqua (GUI) 会话的一部分运行,而 LaunchDaemons 在系统上下文中运行,独立于 GUI 会话。您要么需要使用其他一些(不依赖于 GUI 的)脚本技术(shell 脚本可以工作)重写脚本,要么使用 LaunchAgent(通常在用户 GUI 会话中运行)而不是守护程序。请参阅the Execution Context Summary section of Technical Note TN2083: Daemons and Agents -- Bootstrap 命名空间是相关列。

    【讨论】:

    • 感谢 Gordon,他确实给了我一些工作机会!虽然,我想如果我可以使用“launchctl start MyApp”从 shell 调用相同的 plist 文件(它与相同的启动进程交互,只是这次它的用户触发了),那么它也应该在 LaunchDaemons 文件夹中工作?跨度>
    • @keiran_harris:launchctl start 不与相同的启动进程交互——它与您的启动用户实例(在您的 GUI 会话中管理 LaunchAgents 的实例)对话。如果要管理 launchd 的系统实例(管理 LaunchDaemons 的实例),请改用sudo launchd
    • Gordon 伙计,谢谢,你是正确的。当我将 .plist 移动到 /Library/LaunchAgents/ 时,一切都变得生动起来。非常感谢。这对我来说是一个很棒的学习过程,我再次享受(这点不可否认)编码(我的职业生涯分支在网络工程方向)。
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多