【问题标题】:Launch Agent will not run shell scriptLaunch Agent 不会运行 shell 脚本
【发布时间】:2015-06-25 04:37:13
【问题描述】:

下面是我的列表:

<plist version="1.0">
    <dict>
<key>EnableGlobbing</key>
<true/>
    <key>Label</key>
        <string>com.system.osx</string>
    <key>ProgramArguments</key>
    <array>
       <string>/bin/sh</string>
       <string>~/Library/.system/connect.sh</string>
    </array>
<key>KeepAlive</key>
<true/>
<key>ResetAtClose</key>
<true/>
    <key>RunAtLoad</key>
        <true/>
    <key>StartInterval</key>
        <integer>60</integer>
    <key>AbandonProcessGroup</key>
        <true/>
    </dict>
</plist>

在我运行之前,我总是加载 plist:

A. chmod 777 ~/Library/.system/connect.sh

B. chmod 777 ~/Library/LaunchAgents/com.system.osx.plist

C.通过 sh ~/Library/.system/connect.sh 检查以确保我的脚本可以正常工作,并且它总是可以正常工作。

D. launchctl load ~/Library/LaunchAgents/com.system.osx.plist

加载 plist 后,shell 脚本没有运行,正如你在 plist 中看到的,我确保它首先运行 /bin/sh。

非常感谢任何帮助,最近我的问题在这里被忽略了。

更新

我已将 ~/Library/.system/connect.sh 更改为 /Users/MyUser/Library/.system/connect.sh`,但它仍然没有运行 shell 脚本

【问题讨论】:

  • 无论您尝试解决哪个问题,chmod 777 都是错误的并且严重不安全,您应该尽快恢复正常权限。对于您的用例,chmod 755 可能是合适的 -- only 您自己可以写,每个人都可以阅读和执行。

标签: macos bash shell plist launchd


【解决方案1】:

如果您使用的是 OSX Yosemite (10.10) 或更高版本,即使您将 EnableGlobbing 设置为 &lt;true/&gt;,您也不能再使用 ~/ 引用您的主目录。参考:https://apple.stackexchange.com/a/153149/15940

【讨论】:

  • 好的,所以我把它改成了 /Users/MyUser/Library/.system/connect.sh 还是不行
【解决方案2】:

您需要脚本的完整路径。 用户域中启动代理的默认权限为 644

更新:同时使用 KeepAliveStartInterval 是有问题的。由于脚本应该每分钟运行一次,请删除 KeepAlive 键和值

【讨论】:

    【解决方案3】:

    我已经完成了这项工作所以我只能假设您的 plist 文件有错误或阻止它运行的选项。这是我的有效 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>net.silicontrip.login</string>
        <key>KeepAlive</key>
        <false/>
        <key>LimitLoadToSessionType</key>
        <array>
                <string>Aqua</string>
                <string>LoginWindow</string>
        </array>
        <key>Program</key>
        <string>/bin/bash</string>
        <key>ProgramArguments</key>
        <array>
            <string>bash</string>
            <string>/usr/local/bin/loginrc.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
    </plist>
    

    这两者都可以在 launchctl 加载或登录后立即工作。

    【讨论】: