这个问题困扰了我好久,今天连续搞了6个小时终于搞定.
需要的工具: lingon 可以通过mac port安装最后一个免费的版本,或者可以从sourceforge上下载. 最新的版本已经不能免费使用了,可以从mac app store花几美元买到. 建议用这个工具的原因是因为自己写plist file难免出错.
进入正题, 假设我们要借助launchd在系统启动或者某个user login的时候执行一个任务, 本处以系统启动时创建一个ramdisk为例子. 先假设我们已经写好一个脚本叫ramdisk,路径是/usr/bin/ramdisk, make it executable, 那么剩下的就非常简单了.
1. 在/Library/LaunchDaemons/下创建一个plist文件, 比如叫做com.yourname.ramdisk.plist
2. 编辑文件如下
<?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>Disabled</key> <false/> <key>KeepAlive</key> <true/> <key>Label</key> <string>com.andrew.RamDisk</string> <key>ProgramArguments</key> <array> <string>/usr/bin/ramdisk</string> </array> <key>RunAtLoad</key> <true/> <key>StartInterval</key> <integer>3600</integer> </dict> </plist>
记住一定要将KeepAlive设置成true,否则launchd有可能并不会真正地去执行这个脚本,你用launchctl list看到com.yourname.ramdisk确实被load了,但是并没有PID.
3. 改变该文件的owner和权限
sudo chown -R root:wheel com.yourname.ramdisk.plist
sudo chmod 644 com.yourname.ramdisk.plist
4. reboot and bingo! you found ramdisk mounted. hurray!
注:
(1) launchctl是launchd的user interface
(2) 从osx 10.4 --> 10.5 --> 10.6 plist的规范都有些变化,比如在10.4中可以设置OnDemand,在10.6中OnDemand deprecated 所以就得设置KeepAlive.
(3) lingon可以很方便地帮助用户创建plist文件.
附: mount ramdisk的脚本,不保证没错
#!/bin/sh if ! (ls /Volumes/ | grep "ramdisk" >/dev/null 2>&1); then diskutil erasevolume HFS+ 'ramdisk' `hdiutil attach -nomount ram://262144`; fi