跳至主要内容

Mac launchctl 自定义服务启动

 原文:https://ichochy.com/posts/20231128.html


launchd

launchd – 系统范围内的守护进程(LaunchDaemons)/代理程序(LaunchAgents)的主程序
在启动过程中,内核调用 launchd 作为第一个进程运行,并进一步引导系统的其余部分。

守护进程和服务启动图例

守护进程和服务由 launchd 在两个单独的会话上下文中启动

根据定义,守护进程是系统范围的服务,其中所有客户端都有一个实例。 代理是一种服务,以每个用户为基础运行。
守护进程不应尝试显示 UI 或直接与用户的登录会话交互。 所有涉及与用户交互地应通过代理服务完成,如:运行程序,显示 UI

路径说明

路径加载说明
/System/Library/LaunchDaemons系统启动提供系统范围的守护进程(Apple)
/System/Library/LaunchAgents系统启动提供系统范围的用户代理(Apple)
/Library/LaunchDaemons用户登录提供所有用户的守护进程
/Library/LaunchAgents用户登录提供所有用户的代理进程
~/Library/LaunchAgents用户登录提供当前用户的代理进程

更多具体信息查看系统帮助文档:launchd

launchd.plist

launchd.plist – 系统范围内的守护进程(LaunchDaemons)/代理程序(LaunchAgents)的配置文件

可以使用 launchctl 加载到 launchd 的列表,并根据配置文件的具体参数属性进行配置加载运行。

配置文件的命名

文件命名为 <Label>.plist。 因此,如果您的工作标签(Label)是 com.ichochy.test,您的 plist 文件应命名为:com.ichochy.test.plist

参数属性

  • Label
    • 作业进程的唯一标识,是必要参数
  • Program
    • 作业执行的命令
  • ProgramArguments
    • 作业执行的参数
    • 第一个参数为作业执行的命令,Program存在时,将由Program替代
    • 从第二个参数开始为执行的参数
  • KeepAlive
    • 作业进程是否保留运行
    • false为默认值,停止后不再保留运行
    • true,停止后再次启动运行
    • SuccessfulExit
    • NetworkState
    • PathState
    • Crashed
  • RunAtLoad
    • false为默认值,启动加载时不启动运行
    • true,启动加载时启动运行
  • WorkingDirectory
    • 工作目录
  • EnvironmentVariables
    • 配置环境变量
  • TimeOut
    • 启动超时时间
  • ExitTimeOut
    • 退出超时时间
  • ThrottleInterval
    • 间歇时间
  • StartInterval
    • 间隔启动时间,单位为秒
  • StartCalendarInterval
    • 间隔启动时间,单位可以指定日期
    • Minute
      • 分钟 0-59
    • Hour
      • 小时 0-23
    • Day
      • 天 1-31
    • Weekday
      • 工作日 0-7
    • Month
      • 月 1-12
    • StandardInPath
      • stdin 输入信息的日志路径
    • StandardOutPath
      • stdout 输出信息的日志路径
    • StandardErrorPath
      • stderr 错误输出信息的日志路径
    • ProcessType
      • 进程类型,根据作业类型限制应用资源
      • Background
      • Standard
      • Adaptive
      • Interactive

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">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.ichochy.exampled</string>
        <key>Program</key>
        <string>/path/tp/exampled</string>
        <key>ProgramArguments</key>
        <array>
            <string>exampled</string>
            <string>argv1</string>
            <string>argv2</string>
        </array>
        <key>MachServices</key>
        <dict>
            <key>com.ichochy.exampled</key>
            <true/>
        </dict>
    </dict>
</plist>

“Hello World!” launchd Job

<?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>com.ichochy.hello</string>
        <key>ProgramArguments</key>
        <array>
            <string>hello</string>
            <string>world</string>
        </array>
        <key>KeepAlive</key>
        <true/>
    </dict>
</plist>

Debugging launchd Jobs

<?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>com.ichochy.sleep</string>
        <key>ProgramArguments</key>
        <array>
            <string>sleep</string>
            <string>100</string>
        </array>
        <key>StandardOutPath</key>
        <string>/var/log/myjob.log</string>
        <key>StandardErrorPath</key>
        <string>/var/log/myjob.log</string>
        <key>Debug</key>
        <true/>
        <key>SoftResourceLimits</key>
        <dict>
            <key>Core</key>
            <integer>9223372036854775807</integer>
        </dict>
        <key>HardResourceLimits</key>
        <dict>
            <key>Core</key>
            <integer>9223372036854775807</integer>
        </dict>
    </dict>
</plist>

Running a Job Periodically

<?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>com.ichochy.touchsomefile</string>
        <key>ProgramArguments</key>
        <array>
            <string>touch</string>
            <string>/tmp/helloworld</string>
        </array>
        <key>StartInterval</key>
        <integer>300</integer>
    </dict>
</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>com.ichochy.touchsomefile</string>
        <key>ProgramArguments</key>
        <array>
            <string>touch</string>
            <string>/tmp/helloworld</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Minute</key>
            <integer>45</integer>
            <key>Hour</key>
            <integer>13</integer>
            <key>Day</key>
            <integer>7</integer>
        </dict>
    </dict>
</plist>

Monitoring a Directory

<?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>com.ichochy.watchhostconfig</string>
        <key>ProgramArguments</key>
        <array>
            <string>syslog</string>
            <string>-s</string>
            <string>-l</string>
            <string>notice</string>
            <string>somebody touched /etc/hostconfig</string>
        </array>
        <key>WatchPaths</key>
        <array>
            <string>/etc/hostconfig</string>
        </array>
    </dict>
</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>com.ichochy.mailpush</string>
        <key>ProgramArguments</key>
        <array>
            <string>my_custom_mail_push_tool</string>
        </array>
        <key>QueueDirectories</key>
        <array>
            <string>/var/spool/mymailqdir</string>
        </array>
    </dict>
</plist>

更多具体信息查看系统帮助文档:launchd.plist

launchctl

launchctl – launchd 的管理工具
通过 launchctl 交互来管理和检查 launchd 守护进程、代理进程和 XPC 服务。

命令执行

  launchctl subcommand [arguments ...]

显示加载列表

launchctl list

基本操作

# enable | disable 
launchctl enable  com.ichochy.example.plist      #启用 plist
launchctl disable  com.ichochy.example.plist     #禁用 plist
# load | unload 
launchctl load  com.ichochy.example.plist        #加载 plist
launchctl unload  com.ichochy.example.plist      #卸载 plist
#加载/卸载 plist,
# 参数 w 覆盖操作
# 参数 F 强制操作
launchctl load/unload [-wF] plist  
# start | stop | remove
launchctl start  com.ichochy.example       #启动 plist
launchctl stop  com.ichochy.example        #停止 plist
launchctl remove  com.ichochy.example      #删除 plist

更多具体信息查看系统帮助文档:launchctl

查看日志

launchctl操作时,出现错误后,可以查看launchd日志,了解具体的错误信息

命令查看launchd日志

tail -f /private/var/log/com.apple.xpc.launchd/launchd.log

控制台应用查看launchd日志

  • 应用程序中的实用工具中找到控制台,并打开
  • 切换到日志报告,找到launchd.log,并打开,就可以查看launchd日志

参考引用

launchd
launchd.plist
launchctl
https://developer.apple.com/
https://www.launchd.info/

评论

此博客中的热门博文

2024年自用国外靠谱的 VPS 服务器推荐

原文: https://ichochy.com/posts/vps/20240920.html VPS VPS 服务器可以自主搭建网络服务、个人博客、企业官网、外贸独立站、技术站点等。 LightNode LightNode 成立于2002年,目前拥有员工500余人。 LightNode 自主研发并提供计算、存储、网络和安全等企业必需的基础IT架构资源。依托于自主知识产权的管理平台,为客户提供混合云计算服务和云上运维管理服务。 LightNode 崇尚“技术驱动产品,运维驱动服务”的理念,不断推出适合行业特性的产品和服务。 目前,LightNode已为大量游戏、电商、金融、泛娱乐、企事业等方向的IT部署服务,提供了解决方案与混合云服务。 服务商介绍 全球节点 包含20多个全球节点,其中东南亚及中东地区超过15个节点。 重点部署东南亚地区,包含 美国 硅谷、美国华盛顿、德国法兰克福、土耳其、沙特阿拉伯、阿联酋、柬埔寨、 菲利宾 、 马来西亚 、 泰国 、越南河内、越南胡志明、中国香港、中国台湾、韩国、日本等节点. 一键部署 一键安装部署,可自由选择系统、应用镜像或已有的自定义镜像创建主机 计费粒度小 所有的产品及服务都是按照小时收费, 不足$0.012/小时 完全资源控制 实例权限全放开,端口仅限制 25 端口 多地区选择,遍布全世界 服务器特点和优势 服务器包含大多数的东南亚国家, 原始 IP 在线 。 服务器实例可以随时新建和注销,费用按 小时结算 , 不足$0.012/小时 。 服务器费用低廉,低至 $7.71/月 (约 50元/月)。 服务器资源可以根据需求 自定义配置 , 自选系统 ,支持 Windows 和 Linux。 服务器网络可以根据实际选择按 流量 (1000GB)和 带宽 。 服务器 IP 可以在线免费修改二次 ,可以重开新实例获得 新 IP 的操作。 服务器网络主要为 国际路线 ,国内访问速度一般,可以通过其它高速的服务器进行中转。 服务商推荐 通过推荐推荐地址注册会有95优惠, 首充赠送礼金 LightNode: https://www.lightnode.com/ 推荐地址: https://www.lightnode.com/?inviteCode=JJI33F...

马来西亚 VPS 服务器便宜推荐

 供应商 LightNode   LightNode成立于2002年,目前拥有员工500余人。 LightNode自主研发并提供计算、存储、网络和安全等企业必需的基础IT架构资源。依托于自主知识产权的管理平台,为客户提供混合云计算服务和云上运维管理服务。 LightNode崇尚“技术驱动产品,运维驱动服务”的理念,不断推出适合行业特性的产品和服务。 目前,LightNode已为大量游戏、电商、金融、泛娱乐、企事业等方向的IT部署服务,提供了解决方案与混合云服务。   优势介绍资源 全球节点 包含20多个全球节点,其中东南亚及中东地区超过15个节点   一键部署 一键安装部署,可自由选择系统、应用镜像或已有的自定义镜像创建主机   计费粒度小 所有的产品及服务都是按照小时收费   完全资源控制 实例权限全放开,端口仅限制25端口       马来西亚VPS服务器便宜推荐 服务器实例可以随时 新建 和 注销 , 费用按小时结算 ,避免费用浪费。 服务器费用低廉,低至 $ 7.71 / 月 ( 约 50元/月 )。 服务器资源可以根据需求自定义配置,自选系统,支持 Windows 和 Linux。 服务器网络可以根据实际选择按 流量(1000GB) 和 带宽 服务器 IP 可以在线免费修改二次,当然你也可以重新开启新的实例来达到更新 IP 的操作。 服务器网络主要为 国际路线 ,对国内访问速度不太用好,可以通过其它快速的服务器进行中转。   多地区选择,遍布全世界 推荐 通过推荐推荐地址注册会有 95 优惠  LightNode: https://www.lightnode.com/ 推荐地址: https://www.lightnode.com/?inviteCode=JJI33F&promoteWay=LINK        

菲律宾、马来西亚、泰国等多国 VPS 服务器便宜推荐

  原文: https://ichochy.com/posts/vps/20231022.html 供应商 LightNode LightNode成立于2002年,目前拥有员工500余人。 LightNode自主研发并提供计算、存储、网络和安全等企业必需的基础IT架构资源。依托于自主知识产权的管理平台,为客户提供混合云计算服务和云上运维管理服务。 LightNode崇尚“技术驱动产品,运维驱动服务”的理念,不断推出适合行业特性的产品和服务。 目前,LightNode已为大量游戏、电商、金融、泛娱乐、企事业等方向的IT部署服务,提供了解决方案与混合云服务。 优势介绍资源 全球节点 包含 20多个全球节点 ,其中 东南亚及中东地区 超过15个节点 一键部署 一键安装部署,可自由选择系统、应用镜像或已有的自定义镜像创建主机 计费粒度小 所有的产品及服务都是按照小时收费 完全资源控制 实例权限全放开,端口仅限制 25 端口 多地区选择,遍布全世界 菲律宾 VPS 服务器便宜推荐 服务器包含大多数的东南亚国家,原始 IP 在线。 服务器实例可以随时新建和注销,费用按小时结算,避免费用浪费。 服务器费用低廉,低至 $7.71/月 (约 50元/月)。 服务器资源可以根据需求自定义配置,自选系统,支持 Windows 和 Linux。 服务器网络可以根据实际选择按流量(1000GB)和带宽 服务器 IP 可以在线免费修改二次 ,可以重开新实例获得新 IP 的操作。 服务器网络主要为国际路线,对国内访问速度不太用好,可以通过其它快速的服务器进行中转。 推荐 通过推荐推荐地址注册会有95优惠 LightNode: https://www.lightnode.com/ 推荐地址: https://www.lightnode.com/?inviteCode=JJI33F&promoteWay=LINK 相关文章 第一次通过 SSH key 免密连接 GitHub 的完整过程 2022/11/07 使用 GitHub Actions 自动上传搜索记录到 Algolia 2021/06/12 使用 Algolia 云引擎,实现个人博客 Hugo 本地智能搜索 2021/05...