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


launchd

launchd – 系统范围内的守护进程(LaunchDaemons)/代理程序(LaunchAgents)的主程序 在启动过程中,内核调用 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
    • 作业进程的执行绝对路径
    • Program存在时,将替代ProgramArguments的第一个参数
    • Program不存在时,将由ProgramArguments的第一个参数替代
  • ProgramArguments
    • 作业进程的执行参数
    • Program不存在时,将由ProgramArguments的第一个参数作为作业进程的执行绝对路径
  • 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

launchctllaunchd 的管理工具
通过 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
launchctl remove com.ichochy.example #删除 plist
launchctl start com.ichochy.example #启动 plist
launchctl stop com.ichochy.example #停止 plist

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

参考引用

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

Mac launchctl 自定义服务启动的更多相关文章

  1. mac下 部分服务启动,结束, 查看状态的命令

    以sshd服务为例 启动sshd服务:sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 停止sshd服务:sudo laun ...

  2. centos7下自定义服务启动和自动执行脚本

    systemctl list-units --type=service #查看所有已启动的服务 systemctl enable httpd.service #加入开机自启动服务 systemctl ...

  3. Android系统在新进程中启动自定义服务过程(startService)的原理分析

    在编写Android应用程序时,我们一般将一些计算型的逻辑放在一个独立的进程来处理,这样主进程仍然可以流畅地响应界面事件,提高用户体验.Android系统为我们提供了一个Service类,我们可以实现 ...

  4. linux开机自启动设置,自定义开机启动模版,nginx开机自启动服务

    /etc/init.d 目录,我们把shell脚本放在这个目录下来作为启动脚本 都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别. ...

  5. linux自定义开机启动服务和chkconfig使用方法

    linux自定义开机启动服务和chkconfig使用方法 1. 服务概述在linux操作系统下,经常需要创建一些服务,这些服务被做成shell脚本,这些服务需要在系统启动的时候自动启动,关闭的时候自动 ...

  6. (转)CentOS 7 sytemctl 自定义服务开机启动

    CentOS 7 sytemctl 自定义服务开机启动 原文:http://blog.csdn.net/ithomer/article/details/51766319 CentOS 7继承了RHEL ...

  7. (转)linux自定义开机启动服务和chkconfig使用方法

    原文:https://www.cnblogs.com/jimeper/archive/2013/03/12/2955687.html linux自定义开机启动服务和chkconfig使用方法 1. 服 ...

  8. MongoDB做为一项windows服务启动

    MongoDB做为一项windows服务启动 Windows版本安装 MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的对应版本,有32 ...

  9. Tomcat服务启动成功,但访问index.jsp出错 (jspInit)

    本文引用自 --> http://zhouhaitao.iteye.com/blog/1164736 Tomcat服务启动成功,但访问index.jsp出错 环境:Tomcat6 + jdk6 ...

  10. Mac OS X 上启动 FTP/SFTP server,并设置 log level

    木易小伟的博客| 木易小伟的博客 2013-08-13 5708 阅读 FTP Log SFTP Mac OS 系统配置 1. 启动FTP Server: 命令行下,  sudo -s launch ...

随机推荐

  1. 推荐2款docker可视化管理面板

    1.portainer portainer算是比较知名的开源docker管理工具,功能上比较齐全,不过只有英文版本,没有中文,不过这并不影响他的使用. 官方地址:https://www.portain ...

  2. Linux如何从命令行卡死的进程中退出?

    Linux如何从命令行卡死的进程中退出? 不知道大家在使用Linux的时候,会不会遇到一些命令,有可能卡顿,有可能执行时间过长(比如使用 find 查找某个文件),这个时候我不想继续执行这个命令了,说 ...

  3. 【Python】【魔术方法】(一)构造和初始化

    本篇讲解的魔术方法: __new__ __init__ __del__ __repr__ __format__ __bytes__ 1. __new__ 在Python中,__new__ 方法是一个特 ...

  4. 导入SpaceClaim的iges模型尺寸被放大1000倍的问题

    问题 ANSYS APDL 和 Workbench 联合仿真时,导入 SpaceClaim 的 .iges 模型尺寸被放大 1000 倍数. 如 APDL 生成的尺寸为 10 mm(注:此处的 mm ...

  5. final关键字、Object类--java进阶day01

    1.规则 被final修饰的变量,名称都要大写,多单词的名称则需_来分隔 1.修饰方法 method方法已经不能被重写了,因为修饰该方法的是final 2.修饰类 当一个类中所有的成员方法都不想被重写 ...

  6. javascript 数值交换技巧

    需求 现在存在var a = 1,b = 2;,要求使用javascript实现a & b数值的交换,让a = 2,b = 1. 中间变量(常规实现方式) var a = 1, b = 2; ...

  7. NGUI和UGUI的区别

    1.NGUI的渲染前后顺序是通过Widget的Depth,而UGUI渲染顺序根据Hierarchy的顺序,越下面渲染在顶层 2. NGUI支持图文混排,UGUI暂未发现支持此功能. 3.UGUI没有 ...

  8. Spring 的 resolveBeforeInstantiation 方法作用详解

    一.定义 resolveBeforeInstantiation 是 Spring 框架中 AbstractAutowireCapableBeanFactory 类的核心方法之一,它在 Bean 的实例 ...

  9. 🎀CSS基础-长度单位

    简介 在CSS中,长度单位分为绝对长度单位和相对长度单位.这些单位用于定义元素的尺寸.边距.填充.字体大小等属性值 绝对长度单位 绝对长度单位指的是那些无论环境如何变化,其值都是固定不变的单位.它们通 ...

  10. 大模型向量数据库去重的N种实现方案!

    简单来说,"向量"Vector 是大模型(LLM)在搜索时使用的一种"技术手段",通过向量比对,大模型能找出问题的相关答案,并且进行智能回答. 向量简介 Vec ...