跳至主要内容

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/

评论

此博客中的热门博文

马来西亚 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 服务器,月均只要16.5元/月,优惠推荐

  原文: https://ichochy.com/posts/vps/20240105.html Megalayer 致力于成为全球电信增值服务提供商,为用户在全球范围内提供优质、稳定的互联网服务,目前已经在 香港、日本、美国 等地区部署节点,并且将继续在东南亚地区进行战略布局,提升资源优势以及市场优势。 资费 月资费 年资费,最低16.5元/月 服务器特点和优势 服务器可以月付,低至 24元/月 。 服务器可以年付 199元/年 ,低至 16。5元/月 。 服务器有香港 CN2 优化线路,低延迟,国内访问首选。 服务器还支持多种优化线路, 极低延迟 访问,没有丢包问题。 服务器系统可以选择  Windows  和  Linux  ,可以自定义硬件配置和网络带宽。 服务器支持 支付宝 等其它多种方式购买。 服务器网络测速 优化带宽: 154.55.128.254 全向带宽: 154.39.240.254 国际带宽: 154.39.247.254 服务器推荐 在线推荐有优惠哦 Megalayer 服务商: https://www.megalayer.net/ 推荐地址: https://account.megalayer.net/aff.php?aff=1678  2024 VPS 优惠码: VPS2024-50%OFF 注:注册登录后可以看到特价VPS   相关文章 香港CN2优化线路带宽低延迟VPS服务器推荐  2023/11/20 菲律宾VPS服务器便宜推荐  2023/10/22 Mac launchctl 自定义服务启动  2023/11/28 Mac 终端设置代理,设置一键开启和取消  2023/11/25 第一次通过 SSH key 免密连接 GitHub 的完整过程  2022/11/07

Nginx 配置(Config)中遇到的错误(Error)

  原文: https://ichochy.com/posts/software/20231125.html nginx location 正则错误写法 location 错误的写法 匹配请求目录地址  /555 server { location ~ ^/ \d { 2,3 } $ { …… } } 分析正则 location ~ ^/\d{2,3}$ ~ 为开启正则匹配,这个不能少 ^ 为字符的开始匹配,字符以后面的规则开始 / 为第一个匹配字符 / \d 匹配数字 { 2,3 } 限定数字的个数 2-3 个 $ 为字符的结束匹配,字符以前面的规则结束 上面的会出现错误  pcre_compile() failed: missing 正则解析失败,正则表达式正常是没有问题的,让人很误解 但在 nginx 中不能这样写,需要加上双引号( "" ) location 正则的正确写法 location ~ "^/\d{2,3} $ " 注意:中/英文输入法,需要英文符号的双引号("") 正则规则 ~ 表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配,不使用正则匹配,一般用来匹配目录 = 进行普通字符精确匹配 @ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files !~ 表示正则不匹配,排除正则的匹配,区分大小写 !~* 表示正则不匹配,排除正则的匹配,不区分大小写 . 匹配除换行符以外的任意字符 ? 重复0次或1次 + 重复1次或更多次 * 重复0次或更多次 \d 匹配数字 ^ 匹配字符串的开始 $ 匹配字符串的结束 { n } 重复n次 { n, } 重复n次或更多次 { n,m } 重复n-m次 [ a ] 匹配单个字符a [ a-z ] 匹配a-z小写字母的任意一个 nginx 反向代