mac守护进程

1. launchd

Mac系统下通用的进程管理器,是Mac系统下非常重要的一个进程,一般来说该进程不允许直接以命令行的形式调用。只能通过其控制管理界面,launchctl来进行控制。
launchd主要功能是进程管理。可以理解成是一个常驻在后台的进程,根据用户的配置,来响应特定的系统事件。launchd既可以用于系统级别的服务,又可以用于个人用户级别的服务。

2. 在launchd的语境中,常驻进程有两种:
daemon  # 也就是我们常说的守护进程,这种一般对所有用户都有相同的行为,响应相同的事件,始终运行于后台,没有前台交互界面。
agent   # 这种是用户级别的服务进程,一般以用户的身份运行。
3. 守护进程(daemon)

是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。
通常,守护进程没有任何存在的父进程(即PID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳”。
系统通常在启动时一同起动守护进程。守护进程为对网络请求,硬件活动等进行响应,或其他通过某些任务对其他应用程序的请求进行回应提供支持。守护进程也能够对硬件进行配置(如在某些Linux系统上的devfsd),运行计划任务(例如cron),以及运行其他任务。

4. Mac的守护进程目录有以下几处:
~/Library/LaunchAgents  # 用户的进程
/Library/LaunchAgents   # 管理员设置的用户进程
/Library/LaunchDaemons  # 管理员提供的系统守护进程
/System/Library/LaunchAgents    # Mac操作系统提供的用户进程
/System/Library/LaunchDaemons   # Mac操作系统提供的系统守护进程

以上是launchd的相关配置的存放目录,可以看到,一般我们个人编写的守护进程,都应该放到~/Library/LaunchAgents目录里面。

将定时任务加入系统
#首先要把plist文件放入对相应的目录中(参看4. Mac的守护进程目)
# 加载 your.plist
$ launchctl load /Library/LaunchAgents/your.plist
//添加后进程会直接运行,不用重启电脑

#######查看服务运行状态

$ launchctl list 
PID  Status  Label
-    0    yourLabelName


如果移除移除的话

# 移除 xyz.hanks.spider
$ launchctl unload  /Library/LaunchAgents/your.plist
5.plist文件键值
键值 描述(作用)
Label <string> 必选, 进程的名字唯一标示符
Program <string> 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个元素作为要运行的程序, 任务执行绝对路径
ProgramArguments <array of strings> 字段值会作为Program <string>的参数传入(一般把任务写成可执行文件, 然后紧跟参数),
KeepAlive <boolean or dictionary of stuff> 必选, 是否持续执行任务
WatchPaths <array of strings> 可选, 作用:监听路径. 当任何一个被监听的路径(array中指定的string)被修改时,都会重启任务
QueueDirectories <array of strings> 可选, 和WatchPaths的作用很像,作用是监听路径的修改. 不同之处是,只有这个路径是一个目录并且这个目录不为空时 ,任务才会被重启.
StartOnMount <boolean> This optional key causes the job to be started every time a filesystem is mounted. 具体作用未明
StartInterval <integer> 可选, 每间隔 N 秒 重启任务. 当系统是睡眠状态时,任务会在下次系统被唤醒时重启,睡眠时的多个任务重启事件会被合并成一个事件 (系统睡眠时,无论多少个N秒,系统被唤醒时只会执行一次)
StartCalendarInterval <dictionary of integers or array of dictionary of integers> 可选, 在指定的日历格式的时间点 重启任务, 缺少的参数会被当做通配符(对应参数时间段内任意时间点), 这个命令和 crontab 命令很像(在系统休眠是也会执行任务), 和 corn (系统休眠时不执行任务,系统被唤醒时,多次执行命令合并成一次.同StartInterval <integer>) 不一样. 参数格式详见下 附表2
StandardInPath <string> 可选, 执行任务的标准数据输入的文件路径
StandardOutPath <string> 可选, 任务执行时保存标准输出的文件路径
StandardErrorPath <string> 可选, 任务执行时,保存错误日志的文件路径
Debug <boolean> 可选, 当任务执行,launchd 将临时的调整它的日志mask到LOG_DEBUG
附表2
键值 描述
Minute <integer> 第几分钟时执行任务
Hour <integer> 第几个小时执行任务(采用24时制)
Day <integer> 每个月的第几天执行任务
Weekday <integer> 周几执行任务,(0~7)
Month <integer> 第几个月执行任务

苹果官方文档

6定时任务样例
<?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>xyz.hanks.spider</string>

    <!-- 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个
    元素作为要运行的程序 -->
    <key>Program</key>
    <string>/Users/zhanks/work/Bookshelf/run.sh</string>

    <!-- 每天18:30 -->
    <key>StartCalendarInterval</key>
    <dict>
        <key>Minute</key>
        <integer>30</integer>
        <key>Hour</key>
        <integer>18</integer>
    </dict>
    <!-- 运行间隔,与StartCalenderInterval使用其一,单位为>秒 -->
    <!-- <key>StartInterval</key>-->
    <!-- integer>5</integer>-->

    <!-- 标准错误输出文件,错误日志 -->
    <key>StandardErrorPath</key>
    <string>/Users/zhanks/run-err.log</string>

  </dict>
</plist>

其他定时任务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>xyz.hanks.spider</string> 

    <!-- 要运行的程序, 如果省略这个选项,会把ProgramArguments的第一个
    元素作为要运行的程序 -->
    <key>Program</key>
    <string>/Users/hanks/run.sh</string>

    <!-- 命令, 第一个为命令,其它为参数-->
    <key>ProgramArguments</key>
    <array>
      <string>/Users/hanks/run.sh</string>
    </array>

    <!-- 运行时间 -->
    <key>StartCalendarInterval</key>
    <dict>

      <key>Minute</key>
      <integer>30</integer>

      <key>Hour</key>
      <integer>9</integer>

      <key>Day</key>
      <integer>1</integer>

      <key>Month</key>
      <integer>5</integer>

      <!-- 0和7都指星期天 -->
      <key>Weekday</key>
      <integer>0</integer>

    </dict>

    <!-- 运行间隔,与StartCalenderInterval使用其一,单位为秒 -->
    <key>StartInterval</key>
    <integer>30</integer>

    <!-- 标准输入文件 -->
    <key>StandardInPath</key>
    <string>/Users/hanks/run-in.log</string>

    <!-- 标准输出文件 -->
    <key>StandardOutPath</key>
    <string>/Users/hanks/run-out.log</string>

    <!-- 标准错误输出文件 -->
    <key>StandardErrorPath</key>
    <string>/Users/hanks/run-err.log</string>
  </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>wxx.example</string>
    <key>StandardErrorPath</key>
    <string>/Users/computername/Desktop/eeee.txt</string>
    <key>StandardOutPath</key>
    <string>/Users/computername/Desktop/eeee.txt</string>
    <key>KeepAlive</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>python</string>
        <string>/Users/computername/Desktop/tests/test.py</string>
    </array>
</dict>
</plist>

资料来源:

1. Mac 上利用 launchctl 开启定时任务
2. crontab 定时任务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,126评论 9 467
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,428评论 25 707
  • 从最开始的一脸懵逼,疑似玩笑,到后来的交谈嬉戏,再到现在的暂时分别,不知不觉已有两个月有余。说到分别,其实吾很...
    十杨阅读 229评论 1 0
  • 此刻刚到家,洗漱完毕,每日必做的事就是读写群打卡。 昨晚和女儿、娃爷爷奶奶聊天说要不我们明天去上海逛逛吧!他们说好...
    林子Amy阅读 275评论 0 1
  • 易效能38:道德经难吗? 老师利用堵车的碎片化时间,用标签秒搜法,刻意学习道德经。差距不在时间长短,而在科学有效的...
    总在成长阅读 129评论 0 0