linux中有一个命令可以定期来执行系统任务,比如:执行自检、启动|停止服务、同步时间、curl访问接口等,这就是crond服务
crond属于系统调度进程,有的系统可能init.d目录下没有crond,只有cron,它们是一样的,只是名字不同
crond执行的任务有两种设置方式
1、通过crontab命令设置,crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许
2、通过编辑/etc/crontab文件设置
常用命令
如果以上命令出现错误或其它非正常提示,把crond更换成cron再次尝试。
定时任务设置
1. 输入 crontab -e
2. 大多时候,默认使用vim打开,按下 i 键进入到编辑模式
3. 输入 0 */1 * * * /home/work/start-service.sh
4. 退出编辑模式并保存
crontab命令参数说明
定时任务格式
若上文格式混乱,可参考图片
每列所表示的含义
第1列表示分钟1~59,每分钟用*或者 */1表示;
第2列表示小时1~23(0表示0点);
第3列表示日期1~31;
第4列表示月份1~12;
第5列标识号星期0~6(0表示星期天);
第6列要运行的命令,直接编辑/etc/crontab文件时,第6列表示执行用户,第7列表示要运行的命令。
参数说明
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
实际案例
除/etc/crontab文件外,/var/spool/cron/crontabs 这个目录下存放的是每个用户的crontab任务,以创建者的名字命名。比如tom用户使用crontab -e命令,创建的crontab任务对应的文件就是/var/spool/cron/crontabs/tom,一般一个用户最多只有一个crontab文件。
/etc/crontab与/var/spool/cron/crontabs/的区别
/etc/crontab
/var/spool/cron/crontabs/
总结:/etc/crontab定义的是系统级别的定时任务,由所有用户共享,而/var/spool/cron/crontabs/包含的是每个用户的个人定时任务。两者都服务于定时任务的管理,但一个是全局性的,另一个是用户特定的。
Crontab 直接写入不生效的原因分析与解决办法
直接编辑/etc/crontab文件,写入任务后重启cron服务可以生效,但直接编辑或通过 echo 命令将任务写入 /var/spool/cron/crontabs/root 文件,任务却不会如期执行。
这是因为,直接编辑或通过echo的方式追加该文件时,crond服务并没有重新加载该文件,所以无法读取该文件红新的内容。
解决方案一:
直接采用crontab -e的方式编辑文件,并正常保存退出,然后重启cron服务。
解决方案二:
echo 命令结束后执行crontab /var/spool/cron/crontabs/root 重新加载该文件, 比如:
echo 0 */1 * * * /www/step.sh” >>/var/spool/cron/crontabs/tom
/usr/bin/crontab /var/spool/cron/crontabs/tom
注意
1、cron命令不执行时的排查方法:
⑴ 检查cron有没有运行,如果在运行重启一下cron,让它重新加载配置
⑵ 检查配置文件有没有格式错误
⑶ 检查时区,时间是东8区,设定02:00点执行的命令,实际10:00点执行,这时可以变通下,把时间+8设定为18:00,就可以02:00执行了
2、使用curl访问接口的地址中,不能拼接过多的“&”符号,否则访问失败(此部分属于curl知识,可以直接通过curl命令测试地址是否可行),建议使用nginx的rewrite简化地址,减少错误率。