crontab常用命令
crontab -u user:用来设定某个用户的crontab服务;
crontab file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
crontab -e:编辑某个用户的crontab文件内容。不指定用户,则编辑当前用户的crontab文件。
crontab -l:显示某个用户的crontab文件内容,不指定用户,则显示当前用户的crontab文件内容。
crontab -r:从/var/spool/cron目录中删除某个用户的crontab文件,不指定用户,则默认删除当前用户的crontab文件。
crontab -i:在删除用户的crontab文件时给确认提示。
设置一个定时任务,任务如下,该任务在linux服务器上是可以执行的。
*/1 * * * * python3 /Users/test.py
但是这个任务在mac上是不能执行的。
需要按照一下步骤执行,肯定能搞定,如果还搞不定,私信我。
1、确保crontab在mac上是运行的
# 定时任务统统由 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是否可以执行
crontab -e:编写定时任务脚本
验证 crontab 是否可真正执行
# 每分钟输出当前时间到time.txt上.
*/1 * * * * /bin/date >> /User/time.txt
如果文件有内容,说明能执行。跳转到第4步。
如果文件没有内容,说明crontab不能执行,问题点出在了mac的系统上,看第3步。
3、mac开启crontab的权限
切记,需要勾选。
系统是 OSX 10.15 Catalina 以上的
对 cron 的权限进行了限制
需要在 系统偏好设置 里将 cron 添加 完全磁盘访问权限
重点在这里:::
系统偏好设置 -> 安全性与隐私 -> 选择 隐私 -> 左侧菜单找到完全磁盘访问权限
cron 程序所在目录:
终端输入 whereis cron
打印:/usr/sbin/cron
再输入 open /usr/sbin
在打开的文件夹内找到 cron
把这个文件直接拖动到 系统偏好设置 右侧应用列表框内。勾选上。
可以参考这个动图:https://www.d3tt.com/view/109
4、使用绝对路径
使用python脚本,可能任务还是不执行,主要的原因是:crontab中找不到python的路径。
这个时候需要使用python的绝对路径以及脚本的绝对路径。
如何找python的绝对路径。
which python3
定时任务不执行
原因有这么几个:
1、cron进程是否启动
ps -ef|grep cron
2、cron配置是否正确书写
这个一般没有问题,看看苹果开发社区
3、shell执行的环境是否设置
一般需要要shell脚本前面加上如下两行
#!/bin/bash
source /etc/profile
4、shell脚本是否有问题
这个把脚本在终端手动执行一遍,看一下能否到达效果
5、目录权限问题
这个问题也是一直困扰我好久的问题,以上四点都没有问题的情况的下,建议尝试一下换个目录,我把shell放到了用户的Documents目录下了,如下:
*/2 * * * * /bin/bash -c /Users/qiaohaoting/Documents/access.sh >> /Users/qiaohaoting/Documents/access.log就是无法正常运行,但是access.log文件会生产,不过没有输出内容,说明shell脚本执行失败,但是chomd 777也授权了,连Documents也授权了,corn进程是root用户进程,按道理不应该存在权限问题,难道是MAC corn设置的问题,不让访问?这里还望做MAC开发的大佬指点迷津。然后我把文件放到/Users/qiaohaoting/下,然后就可以正常运行了。
crontab表达式
crontab中的每一行代表一个定期执行的任务,分为6个部分。前5个部分表示何时执行命令,最后一个部分表示执行的命令。
每个部分以空格分隔,除了最后一个部分(命令)可以在内部使用空格之外,其他部分都不能使用空格。
前5个部分分别代表:分钟,小时,天,月,星期,每个部分的取值范围如下:
分钟 0 - 59 小时 0 - 23 天 1 - 31 月 1 - 12 星期 0 - 6 0表示星期天
除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:
星号 表示任意值,比如在小时部分填写 * 代表任意小时(每小时)
逗号 可以允许在一个部分中填写多个值,比如在分钟部分填写 1,3 表示一分钟或三分钟
斜线 一般配合 * 使用,代表每隔多长时间,比如在小时部分填写 */2 代表每隔两分钟。
所以 */1 和 * 没有区别,*/2 可以看成是能被2整除的任意值。
例如:每天15:00执行AutoApplescript.applescript脚本,16:10执行AutoLog.sh
sudo crontab -e 0 15 * * * osascript /Users/XXX/Desktop/AutoDeployment/AutoApplescript.applescript 10 16 * * * /bin/sh /Users/XXX/Desktop/AutoDeployment/AutoLog.sh > /Users/XXX/Desktop/auto.log 2>&1