launchctl是什么?
与Linux下的systemctl类似,可以管理服务。
怎样新增自己的服务?
通过在特定目录下添加plist文件来添加服务,plist文件就是一个xml文件,可以使用xcode进行编辑,也可以用文本编辑器编辑。
可放置plist文件的目录
| 类型 | 目录 | 加载时机 | 运行身份 | 是否所有用户都会加载 |
|---|---|---|---|---|
| 系统daemon | /System/Library/LaunchDaemons | 登录前 | root或通过UserName字段指定的用户 | 是 |
| 系统agent | /System/Library/LaunchAgents | 登录后 | 当前登录用户 | 是 |
| 全局daemon | /Library/LaunchDaemons | 登录前 | root或通过UserName字段指定的用户 | 是 |
| 全局agent | /Library/LaunchAgents | 登录后 | 当前登录用户 | 是 |
| 用户agent | ~/Library/LaunchAgents | 登录后 | 当前登录用户 | 否(因为~对不同用户代表不同的绝对目录) |
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>MyServiceName</string>
<key>ProgramArguments</key>
<array>
<string>fullPathToMyExecutable</string>
<string>arg1</string>
<string>arg2</string>
</array>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>FullPathToStdout.txt</string>
<key>StandardErrorPath</key>
<string>FullPathToStderr.txt</string>
<key>Program</key>
<string>fullPathToMyExecutable</string>
</dict>
</plist>
怎样让服务开机启动?
设置RunAtLoad字段(与KeepAlive同级)为true
怎样保证服务进程退出后自动重启?
设置KeepAlive字段为true,这样就不用设置RunAtLoad字段了
经过测试,进程退出后每隔10秒系统就会启动它一次
修改plist后,手动加载plist文件
launchctl load [plistFile]
注意:如果之前load过,要先unload
服务的停止与启动
停止:
launchctl stop [MyServiceName]
启动
launchctl start [MyServiceName]
这里的MyServiceName就是在plist文件中配置的Label字段的值。
查看当前有哪些服务
launchctl list
怎样获取服务进程的输出
参照上面的例子指定标准输出或标准错误流到某个文件(对应字段为StandardOutPath和StandardErrorPath)
怎样让服务在指定的时间点执行?
配置StartCalendarInterval字段即可,例如:
<?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>MyServiceName</string>
<key>ProgramArguments</key>
<array>
<string>fullPathToMyExecutable</string>
<string>arg1</string>
<string>arg2</string>
</array>
<key>StandardOutPath</key>
<string>FullPathToStdout.txt</string>
<key>StandardErrorPath</key>
<string>FullPathToStderr.txt</string>
<key>Program</key>
<string>fullPathToMyExecutable</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>45</integer>
<key>Hour</key>
<integer>11</integer>
</dict>
<dict>
<key>Minute</key>
<integer>46</integer>
<key>Hour</key>
<integer>12</integer>
</dict>
</array>
</dict>
</plist>
上面的服务,会在每天的11:45和12:46执行。也就是StartCalendarInterval字段下array中的每个元素内各个限制条件之间是“且”的关系,array中每个元素之前是“或”的关系。
更多信息
可以通过man了解更多信息,例如
man launchctl
man launchd.plist
man launchd