launchctl是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。通过配置文件来指定执行周期和任务的。在Mac上,也可以像Linux系统一样,使用crontab命令来添加定时任务。下面将手把手教你在mac上创建定时任务。

任务目标:每天晚上十点定时执行/Users/demo/helloworld.py的python程序。

1. 创建run.sh脚本

```bash

#!/bin/sh

# 记录一下开始时间

echo `date` >> /Users/demo/log &&

# 进入helloworld.py程序所在目录

cd /Users/demo &&

# 执行python脚本(注意前面要指定python运行环境/usr/bin/python,根据自己的情况改变)

/usr/bin/python helloworld.py &&

# 运行完成

echo 'finish' >> /Users/demo/log

:wq

chmod 777 run.sh

```

2. 编写plist文件

launchctl 将根据plist文件的信息来启动任务。plist脚本一般存放在以下目录:

- /Library/LaunchDaemons/Library/LaunchAgents

- ~/Library/LaunchAgents (由用户自己定义的任务项)

- /Library/LaunchAgents (由管理员为用户定义的任务项)

- /Library/LaunchDaemons (由管理员定义的守护进程任务项)

- /System/Library/LaunchAgents (由Mac OS X为用户定义的任务项)

- /System/Library/LaunchDaemons (由Mac OS X定义的守护进程任务项)

新建一个名为com.demo.plist的文件,内容如下:

```xml

Label

com.demo

ProgramArguments

/bin/sh

/Users/demo/run.sh

RunAtLoad

```

保存文件后,将其放入以下目录之一:

- ~/Library/LaunchAgents (由用户自己定义的任务项)

- /Library/LaunchDaemons (由管理员为用户定义的任务项)

以下是重构后的内容:

```xml

Label

com.demo.plist

ProgramArguments

/Users/demo/run.sh

StartCalendarInterval

Minute

00

Hour

22

StandardOutPath

/Users/demo/run.log

StandardErrorPath

/Users/demo/run.err

```

加载命令:

```bash

launchctl load -w com.demo.plist

```

更多命令:

- 加载任务:`launchctl load -w com.demo.plist`,使用 `-w` 选项会将 plist 文件中无效的 key 覆盖掉。建议加上 `$ launchctl load -w com.demo.plist`。

- 删除任务:`$ launchctl unload -w com.demo.plist`。

- 查看任务列表:`$ launchctl list | grep 'com.demo'`。使用 `grep` 函数过滤出包含 "com.demo" 的任务部分名字。

- 开始任务:`$ launchctl start com.demo.plist`,可以测试任务,这个是立即执行,不管时间到了没有。

- 停止任务:`$ launchctl stop com.demo.plist`。如果任务被修改了,那么必须先使用 `unload` 命令卸载,然后重新加载。

番外篇:

- StartInterval:指定脚本每间隔多长时间(单位:秒)执行一次。

- StartCalendarInterval:可以指定脚本在多少分钟、小时、天、星期几、月时间上执行,类似于 crontab 中的设置。包括以下键值对:

```

Minute The minute on which this job will be run.

Hour The hour on which this job will be run.

Day The day on which this job will be run.

Weekday The weekday on which this job will be run (0 and 7 are Sunday).

Month The month on which this job will be run.

```

plist部分参数说明:

- Label:需要保证全局唯一性对应的标签。

- Program:要运行的程序。

- ProgramArguments:命令语句。

您可以使用crontab命令或launchctl命令在Mac上添加定时任务。使用crontab命令,您可以在固定的间隔时间执行指定的系统指令或shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

以下是一个示例crontab文件:

```

* * * * * /path/to/your/script.sh

```

这将在每分钟运行一次您的脚本。如果您想要每天晚上10点运行脚本,可以使用以下crontab文件:

```

0 22 * * * /path/to/your/script.sh

```