7

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

因此,我在 ~/Library/LaunchAgents 中创建了一个 plist 文件(其内容见下文 - 它应该寻找对 /Volumes 的更改),我创建了一个 shell 脚本,上面写着“哔” - 稍后它会做一些更有用的事情.

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>

外壳脚本:~/Library/Scripts/runwhenSDmount

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

3 回答 3

8

在 ~/Library/LaunchAgents 文件夹中创建新的 plist 后,您必须告诉已启动的应用程序。做到这一点的两种基本方法是:

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

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

    launchctl load {Path-to-plist}
    

launchctl 命令也可以用来阻止launchd 使用plist。为此,请使用:

launchctl unload {Path-to-plist}

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

于 2011-07-31T02:15:23.093 回答
8

我只是在~/Library/LaunchAgents中自动启动服务时遇到了类似的问题,但在我的情况下,*.plist 定义的服务都没有启动。

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

chmod 700 ~/Library/LaunchAgents.

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

昨天我刚刚找到了 LaunchRocket,它是一个 Mac PreferencePane,用于使用 launchd 管理服务。它支持自制软件,并添加了一个很好的 UI 来管理已启动的自制软件服务。

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

于 2012-05-14T08:54:45.623 回答
2

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

  1. LaunchControl - “ LaunchControl 是一个功能齐全的 launchd(8) 前端,允许您在 Mac 上创建、管理和调试系统和用户服务。
  2. Lingon -“一个易于使用但功能强大的实用程序,可在您的 Mac 上自动运行

作为说明:Brett Terpstra(他在nvAlt等方面做了很多出色的 Mac 工作)最近在他的帖子“使用 notifyutil 和 launchd 远程触发任务”中评论说,他曾经使用 Lingon,但最近一直在使用 LaunchControl。他们中的任何一个都值得研究。

于 2013-03-10T21:33:36.330 回答