〜/ Library / LaunchAgents plist手动运行但不自动运行

时间:2010-12-20 00:29:52

标签: launchd

我开始使用launchd并希望设置一个plist文件,这样每当我将SD卡插入我的Mac mini服务器(使用Snow Leopard Server)时,我想要一个shell脚本运行(应该复制所有jpg文件,重命名等等。)

所以,我在〜/ Library / LaunchAgents中创建了一个plist文件(参见下面的内容 - 它应该寻找/ Volumes的更改)并且我创建了一个shell脚本,上面写着“beep” - 稍后它会做更有用的东西。

plist文件在launchctl中注册,当我运行它时(launchctl start com.peters.runwhenSDmount),计算机在插入存储卡时会发出蜂鸣声,并在没有存储卡时保持静音。因此,plist确实调用了shell脚本,随后检查特定的SD卡是否存在。我认为这也证明了SD卡的权限没有问题。

但是,它似乎并没有自己运行???知道为什么??


plist文件:〜/ Library / LaunchAgents / com.peters.runwhenSDmount.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<dict>
    <key>Label</key>
    <string>com.peters.runwhenSDmount</string>
    <key>LowPriorityIO</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
    <string>/Users/peter/Library/Scripts/runwhenSDmount</string>
    </array>
    <key>ThrottleInterval</key>
    <integer>10</integer>
    <key>WatchPaths</key>
    <array>
    <string>/Volumes</string>
    </array>
</dict>
</plist>

shell脚本:〜/ Library / Scripts / runwhenSDmount

#!/bin/bash
if [ -d "/Volumes/NIKON D40X" ]; then
    say beep
fi

3 个答案:

答案 0 :(得分:7)

在〜/ Library / LaunchAgents文件夹中创建新的plist后,您必须告诉launchd应用程序。这样做的两个基本方法是:

  1. 注销然后重新登录。 - 每次登录时,launchd都会扫描〜/ Library / LaunchAgents文件夹的内容并添加它在那里找到的任何plist。

  2. 使用“launchctl”从终端命令行加载plist。该命令的语法是:

    launchctl load {Path-to-plist}
    
  3. launchctl命令也可用于停止使用plist启动。为此,请使用:

    launchctl unload {Path-to-plist}
    

    launchctl命令在开发plist时非常有用,因为它可以快速轻松地在更改之间卸载/加载它们。一旦你有一个plist以你喜欢的方式工作,自动登录启动加载就可以接管。

答案 1 :(得分:7)

我在〜/ Library / LaunchAgents 中自动启动服务时遇到了类似的问题,但在我的情况下,* .plist定义的服务的NONE已经启动。

问题显然与目录〜/ Library / LaunchAgents 有关,而不是plist文件本身。解决方案是重置文件权限。

chmod 700 ~/Library/LaunchAgents

自制用户更新:(2015-02-23)

昨天我刚发现LaunchRocket是用于使用launchd管理服务的Mac PreferencePane。它是自制的,并且为管理启动的自制服务添加了一个很好的UI。

这可能无法帮助您处理不正确的用户权限,但它是开源的,因此您可以fork the project并将权限检查添加为功能。

答案 2 :(得分:2)

有助于创建和管理launchd项目的两个工具是:

  1. LaunchControl - “ LaunchControl是一个功能齐全的launchd(8)前端,允许您在Mac上创建,管理和调试系统和用户服务。
  2. Lingon - “一款易于使用且功能强大的实用程序,可在Mac上自动运行
  3. 作为一个注释:Brett Terpstra(他在nvAlt之类的东西上做了很多伟大的工作)最近在他的帖子“Triggering tasks remotely with notifyutil and launchd”中评论过他曾经使用过Lingon,但一直在使用最近LaunchControl。他们中的任何一个都值得研究。