前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mac 中的定时任务

Mac 中的定时任务

作者头像
chuchur
发布2023-01-12 17:11:29
2.8K0
发布2023-01-12 17:11:29
举报
文章被收录于专栏:禅境花园

写了一堆爬虫丢服务器上跑,很显然隔一段时间这个爬虫就会废掉。IP 被封是理所当然的。

所以决定放到本地。第一时间 想到的是crontab , 按照Linux 配置一通,发现任务无法执行。

Mac OS launchd

不用想, 定时器不会被执行的,crontab 已经被 Mac OS废弃了,替代品就是 launchd

launchd 配置目录

用来存放 定时器任务配置文件的 有5个目录 ,官方

  • /System/Library/LaunchDaemons 不用登陆也要运行,Apple 提供的系统守护进程
  • /System/Library/LaunchAgents Apple提供的代理,适用于每个用户的所有用户
  • /Library/LaunchDaemons 不用登陆也要运行,第三方系统守护进程
  • /Library/LaunchAgents 需要root登录并且配置文件归root所有
  • ~/Library/LaunchAgents 需要非root登录,并且配置文件归非root所有
进到对应作业的目录

当然是 不登陆也要运行的,一开机,不输入密码也要搞起来。

代码语言:javascript
复制
cd /Library/LaunchDaemons
创建plist配置文件

在对应的目录创建配置文件

代码语言:javascript
复制
vi com.vix.cron.plist

内容如下:

代码语言:javascript
复制
<?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.vix.cron</string>

    <key>ProgramArguments</key>
    <array>
      <string>/Users/chuchur/crontab-test.sh</string>
    </array>

    <key>Nice</key>
    <integer>1</integer>

    <key>StartInterval</key>
    <integer>60</integer>

    <key>RunAtLoad</key>
    <true />

    <key>StandardErrorPath</key>
    <string>/tmp/test.err</string>

    <key>StandardOutPath</key>
    <string>/tmp/test.out</string>
  </dict>
</plist>

大概意思就是没60秒执行一次 /Users/chuchur/crontab-test.sh

加载配置文件

使用 launchctl加载配置文件

代码语言:javascript
复制
launchctl load com.vix.cron.plist
# or
# launchctl load /xxx/xxx/com.alvin.crontabtest.plist

不需要定时器了可以卸载

代码语言:javascript
复制
launchctl unload /xxx/xxx/com.alvin.crontabtest.plist

查看有多少作业在执行

代码语言:javascript
复制
sudo launchctl list | grep 'cron'

但是看这个只是简单的任务逻辑,复杂的怎么办,时分秒日月周 几个小时,几天执行一次。当然他除了StartInterval还有StartCalendarInterval

代码语言:javascript
复制
<?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.vix.cron</string>

    <key>ProgramArguments</key>
    <array>
      <string>/Users/chuchur/crontab-test.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Day</key>
        <integer>11</integer>
        <key>Hour</key>
        <integer>0</integer>
        <key>Minute</key>
        <integer>0</integer>
        <key>Month</key>
        <integer>7</integer>
        <key>Weekday</key>
        <integer>0</integer>
    </dict>
  </dict>
</plist>

Mac 只是说废弃了crontab,又没说不再支持了,我就是要用crontab 怎么办?

折腾如下:

配置crontab

借鉴下 Linux 定时任务 配置方法

1)确保crontab 在mac上是运行的

代码语言:javascript
复制
# 定时任务统统由 launchctl 来管理的,看看 cron 任务有没有在里面
sudo launchctl list | grep cron 

# 有记录。查看一下启动项的配置
locate com.vix.cron

# 创建一个database
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

# 查看 /etc/crontab 是否存在
ls -alF /etc/crontab

# 创建该文件(如果不存在)
sudo touch /etc/crontab

2)验证crontab是否可以执行

编写定时任务脚本

代码语言:javascript
复制
contrab -e

写入定时任务

代码语言:javascript
复制
0  */1  * * *   spider todo

每隔一个小时运行一次。查看任务:

代码语言:javascript
复制
contrab -l

在mac里 ,crontab 配置文件在这个目录 /usr/lib/cron/tabs/

代码语言:javascript
复制
cat /usr/lib/cron/tabs/[user name]

看到的是和 contrab -l看到的一样,可见配置没有问题的。

3)mac开启crontab的权限

  1. 系统偏好设置 -> 安全性与隐私 -> 选择 隐私 -> 左侧菜单找到完全磁盘访问权限
  2. cron 程序所在目录:
  3. 终端输入 whereis cron
  4. 看到:/usr/sbin/cron
  5. 再输入 open /usr/sbin
  6. 在打开的文件夹内找到 cron
  7. 把这个文件直接拖动到 系统偏好设置 右侧应用列表框内。勾选上。

收工。

脚本无法运行的解决

脚本无法运行的可以尝试以下:

1)修改 crontab -e ,如 :

代码语言:javascript
复制
* * * * * whoami >> /Users/[your name]/test.txt

改成

代码语言:javascript
复制
* * * * * /usr/bin/whoami >> /Users/[your name]/test.txt

也就是命令要写全路径。

2)修改脚本 头部第二行加上如下代码:

代码语言:javascript
复制
#!/usr/bin/env bash
source /etc/profile #加上这一行
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mac OS launchd
    • launchd 配置目录
      • 进到对应作业的目录
      • 创建plist配置文件
      • 加载配置文件
  • 配置crontab
  • 脚本无法运行的解决
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档