首页 > 技术分享 > Debian
收藏

Debian定时任务cron/crond/crontab使用方法和常见问题

09/21 11:28
大潇博客 原创文章,转载请标明出处

linux中有一个命令可以定期来执行系统任务,比如:执行自检、启动|停止服务、同步时间、curl访问接口等,这就是crond服务


crond属于系统调度进程,有的系统可能init.d目录下没有crond,只有cron,它们是一样的,只是名字不同


crond执行的任务有两种设置方式

1、通过crontab命令设置,crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许

2、通过编辑/etc/crontab文件设置


常用命令

service crond start     //启动服务

service crond stop      //关闭服务

service crond restart   //重启服务

service crond reload    //重新载入配置

service crond status    //查看crontab服务状态

如果以上命令出现错误或其它非正常提示,把crond更换成cron再次尝试。


定时任务设置

crontab -e

或者

vi /etc/crontab

1. 输入 crontab -e

2. 大多时候,默认使用vim打开,按下 i 键进入到编辑模式

3. 输入 0 */1 * * * /home/work/start-service.sh

4. 退出编辑模式并保存


crontab命令参数说明

crontab [-u username] [-l|-e|-r]

-u: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度;

-e: 编辑crontab 的工作内容;

-l: 查阅crontab的工作内容;

-r: 删除所有的crontab的工作内容,若仅要删除一项,请用-e去编辑。


定时任务格式

*      *    *    *    *  command

分 时  日  月  周    命令

若上文格式混乱,可参考图片

定时任务格式.png


每列所表示的含义

第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字段,表示每十分钟执行一次。


实际案例

0 5 * * * /usr/local/do.sh   //每天凌晨5点执行do.sh文件


10 20 * * * /usr/local/nginx/sbin/nginx -s restart   //每晚的20:10重启nginx


30 8 3,13,23 * * /usr/local/nginx/sbin/nginx -s restart  //每月3、13、23日的8 : 30重启nginx


0 23 * * 6 /usr/local/nginx/sbin/nginx -s restart   //每星期六的晚上11 : 00重启nginx


20 5 * * 5,0 /usr/local/nginx/sbin/nginx -s restart  //每周六、周日的5 : 20重启nginx


0,30 18-22 * * * /usr/local/nginx/sbin/nginx -s restart   //每天18 : 00至22 : 00之间每隔30分钟重启nginx


0 23-7/1 * * * /usr/local/nginx/sbin/nginx -s restart    //晚上11点到早上7点之间,每隔一小时重启nginx


*/1 * * * * root curl http://www.***.com/update_url    //每一分钟访问一次接口


0 */1 * * * /usr/local/nginx/sbin/nginx -s restart   //每一小时重启nginx


0 12 6 * mon-wed /usr/local/nginx/sbin/nginx -s restart    //每月的6号与每周一到周三的12点重启nginx


0 5 1 jan * /usr/local/nginx/sbin/nginx -s restart     //一月一号的5点重启nginx


*/30 * * * * /usr/sbin/ntpdate 210.72.145.44    //每半小时同步一下时间,中国国家授时站的IP地址,同步成功率为99%


除/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

  • 用途:/etc/crontab 是全局的crontab配置文件,它定义了系统范围内定期执行的任务。
  • 内容:它包含一个或多个用户定义的定时任务,以及crontab守护进程crond的配置。
  • 格式:每行通常包含五个字段:分钟、小时、日、月、星期、命令或脚本路径。
  • 权限:通常只有root用户可以编辑这个文件。
  • 作用范围:/etc/crontab定义的任务会为所有用户执行。


/var/spool/cron/crontabs/

  • 用途:/var/spool/cron/crontabs/ 包含每个用户个人的crontab文件。每个用户可以在这里创建自己的定时任务。
  • 内容:与/etc/crontab类似,每个用户的crontab文件包含用户特定的定时任务。
  • 格式:与/etc/crontab中的格式相同。
  • 权限:每个用户的crontab文件只有该用户和root有读写权限。
  • 作用范围:/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简化地址,减少错误率。


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311