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

苹果官方文档

6定时任务样例



  

    Label
    xyz.hanks.spider

    
    Program
    /Users/zhanks/work/Bookshelf/run.sh

    
    StartCalendarInterval
    
        Minute
        30
        Hour
        18
    
    
    
    

    
    StandardErrorPath
    /Users/zhanks/run-err.log

  


其他定时任务plist文件
  
  
  
  
    
    Label
    
    xyz.hanks.spider 

    
    Program
    /Users/hanks/run.sh

    
    ProgramArguments
    
      /Users/hanks/run.sh
    

    
    StartCalendarInterval
    

      Minute
      30

      Hour
      9

      Day
      1

      Month
      5

      
      Weekday
      0

    

    
    StartInterval
    30

    
    StandardInPath
    /Users/hanks/run-in.log

    
    StandardOutPath
    /Users/hanks/run-out.log

    
    StandardErrorPath
    /Users/hanks/run-err.log
    

自测例子




    Label
    wxx.example
    StandardErrorPath
    /Users/computername/Desktop/eeee.txt
    StandardOutPath
    /Users/computername/Desktop/eeee.txt
    KeepAlive
    
    ProgramArguments
    
        python
        /Users/computername/Desktop/tests/test.py
    


资料来源:

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

你可能感兴趣的:(mac守护进程)