Mac下使用launchctl管理服务

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

参考

  1. https://www.xiebruce.top/983.html
  2. https://www.launchd.info/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容