crontab是一种定时任务调度工具,其用途就是根据表达式在特定的时间执行特定的任务。具体的时间可以用cron表达式表述,任务可以是sh脚本,也可以是shell命令。
一、cron表达式
linux的cron表达式和Java中的格式有些区别,linux是分、时、日、月、周,而Java中的cron的表达式是秒、分、 时、日、月、周。推荐一个不错的cron表达式网站:crontab执行时间计算 - 在线工具。
linux cron表达式格式说明:
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分 (0 - 59)
具体例子:0 */12 * * * 代表每隔12小时执行一次
二、crontab在mac中没有执行的原因
之前一直使用linux的crontab,后来在mac平台上需要用到crontab,第一次使用的时候发现crontab没有生效。于是研究了其没有执行的原因,综合网上的一些资料及自己的实践,归结下面原因:
1、cron表达式错误
如果mac上的crontab没有生效,首先得检查下cron表达式是否有错。注意mac中的cron表达式和Java中的不同,Java是精确到秒的,所以有6个部分,而mac中的表达式和linux一样,只有5个部分。具体可以参考上述cron表达式说明部分。
2、验证crontab是否真的没有执行
如果cron表达式确实没有问题,可以验证下crontab是否真的没有执行。可以在终端中执行下述命令:
sudo launchctl list | grep cron
执行上述命令,我的机器中回显:280 0 com.vix.cron。该回显说明定时任务是开启的。
3、写个简单的任务验证
如果crontab任务确实是开启的,可以写个简单的任务验证下。
- 开启任务编辑。在终端中输入 crontab -e。
- 在开启的任务中输入内容。如:* * * * /bin/date >> /Users/admin/sh/test。作用是每隔1分钟将系统时间输出到/Users/admin/sh/目录下的test文件中,其中/Users/admin/sh/需要替换成自己的路径。
- 检查test文件。等1分钟后看看/Users/admin/sh/test文件是否有数据,如果有数据,则说明任务是能正常执行的,否则说明未正常执行。如果未正常执行,可以看下述第4部分。
4、添加环境变量
如果第3部分能正常执行,但是crontab里的脚步还是没法执行,则需要检测脚本本身是否有问题。可以在终端中执行下述命令:
>> bash test.sh
其中的test.sh是你自己的脚本文件。假如脚本文件能正常执行,说明脚本本身没问题,需要进一步排查是否环境变量引起的。因为手动执行脚本时,当前shell环境下程序能够找到环境变量,但是使用crontab时不一定能找到。因此需要在crontab文件中制定任务运行所需要的所有环境变量。
打开你自己的脚本文件,假设脚本是/Users/admin/sh/test.sh,在头部加上下述内容:
#!/bin/bash
source /etc/profile
保存自己的脚本,然后在终端中执行下述步骤:
1、首先在终端中输入:
>> crontab -e
2、在打开的crontab编辑器中输入
* * * * * bash /Users/admin/sh/test.sh
最后静静地等待任务的调度,成功的感觉真好o(^▽^)o。
三、总结
本文主要讲解mac系统中crontab无法正常执行的一些可能原因。最开始简单介绍了下cron表达式,然后介绍排查crontab无法正常执行的可能原因及解决方法。当然限于本人认知有限,可能还有其他原因会导致crontab无法正常执行。本文记录了自己之前遇到的问题然后对应的解决思路,思路仅供参考。