我开始使用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
答案 0 :(得分:7)
在〜/ Library / LaunchAgents文件夹中创建新的plist后,您必须告诉launchd应用程序。这样做的两个基本方法是:
注销然后重新登录。 - 每次登录时,launchd都会扫描〜/ Library / LaunchAgents文件夹的内容并添加它在那里找到的任何plist。
使用“launchctl”从终端命令行加载plist。该命令的语法是:
launchctl load {Path-to-plist}
launchctl命令也可用于停止使用plist启动。为此,请使用:
launchctl unload {Path-to-plist}
launchctl命令在开发plist时非常有用,因为它可以快速轻松地在更改之间卸载/加载它们。一旦你有一个plist以你喜欢的方式工作,自动登录启动加载就可以接管。
答案 1 :(得分:7)
我在〜/ Library / LaunchAgents 中自动启动服务时遇到了类似的问题,但在我的情况下,* .plist定义的服务的NONE已经启动。
问题显然与目录〜/ Library / LaunchAgents 有关,而不是plist文件本身。解决方案是重置文件权限。
chmod 700 ~/Library/LaunchAgents
。
昨天我刚发现LaunchRocket是用于使用launchd管理服务的Mac PreferencePane。它是自制的,并且为管理启动的自制服务添加了一个很好的UI。
这可能无法帮助您处理不正确的用户权限,但它是开源的,因此您可以fork the project并将权限检查添加为功能。
答案 2 :(得分:2)
有助于创建和管理launchd项目的两个工具是:
作为一个注释:Brett Terpstra(他在nvAlt之类的东西上做了很多伟大的工作)最近在他的帖子“Triggering tasks remotely with notifyutil and launchd”中评论过他曾经使用过Lingon,但一直在使用最近LaunchControl。他们中的任何一个都值得研究。