留言本-CmdEye技术交流博客
留言本-CmdEye技术交流博客
留言本-CmdEye技术交流博客

Centos7设置定时任务

Centos7设置定时任务

在centos上最常用的定时任务应该就是crontab了,在经过各种度娘之后有三种方式实现定时任务的方法,但是所用到的场景有所不同

at    适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。
crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现
anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未>执行的任务,下次开机时可以补上执行

这里也直讲最常用的crontab,主要其他两种我也没看也没测试

关于crontab和crond

用到crontab那么就一定要知道crond,crond和crontab是不可分割的,crond我的理解是一个守护进程,或者说这才是我们定时任务的核心,crontab是一个编辑或者说是管理定时任务的工具
crontab我的理解就是crond服务处于启动状态,这个服务会默认每分钟去检测是否有需要执行的定时任务,所以crond不能守护秒级定时任务。而这个任务的具体内容是通过crontab来管理的,至于具体管理方式后面继续讲

安装

一般情况下crond、crontab是安装好的,这里主要提一下万一没有crontab你别想着直接用yum去安装crond或者crontab因为你会发现找不到包,其实定时任务的包是cronie。(这里因为我遇到了所以提一下)

yum install -y cronie
systemctl enable crond (设为开机启动)
systemctl start crond(启动crond服务)
systemctl status crond (查看状态)

crond和crondtab常用命令

crond常用命令

systemctl start   crond         启动服务
systemctl stop    crond         停止服务
systemctl restart crond         重启服务
systemctl reload  crond         重载配置文件
systemctl status  crond         查看状态

crontab常用命令

crontab -u 		设定某个用户的cron服务
crontab -l		显示crontab文件(显示已设置的定时任务)
crontab -e		编辑crontab文件(编辑定时任务)
crontab -r		删除crontab文件(删除定时任务)
crontab -i		删除crontab文件提醒用户(删除定时任务)

三种编辑定时任务的方式

定时任务格式

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

用户的定时任务分6段,分别是:分,时,日,月,周,命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

*:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59分
-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次
定时任务格式

1、直接编辑配置文件

配置文件路径:/etc/crontab
在配置文件中,原本6个段的配置,我们需要在命令前面再加一个用户段
即:分 时 日 月 周 用户 命令
直接添加到最后一行即可

2、使用crontab -e 命令编辑

使用命令编辑相当于就是编辑当前用户的任务,所以不需要加用户字段,这里就是6段

* * * * * /home/wsj/scheduledTest.sh

3、直接编辑目标文件

进入/var/spool/cron/

如果你执行了以上两种方式,你再进来看一下这个目录下的文件你可能会发现一点问题
这里的文件都是以用户名来命名的,你再打开你使用crontab -e 添加过任务的用户文件,原来crontab -e编辑的就是这里的文件,所以我们如果需要为哪个用户添加任务,只用编辑这个目录下对应用户的文件即可

4、实例

参数说明:
分钟(0-59) 小时(0-23) 日(1-31) 月(11-12) 星期(0-6,0表示周日) 用户名 要执行的命令

*/30 * * * root /usr/local/mycommand.sh (每天,每30分钟执行一次 mycommand命令)

* 3 * * * root /usr/local/mycommand.sh (每天凌晨三点,执行命令脚本,PS:这里由于第一个的分钟没有设置,那么就会每天凌晨3点的每分钟都执行一次命令)

0 3 * * * root /usr/local/mycommand.sh (这样就是每天凌晨三点整执行一次命令脚本)

*/10 11-13 * * * root /usr/local/mycommand.sh (每天11点到13点之间,每10分钟执行一次命令脚本,这一种用法也很常用)

10-30 * * * * root /usr/local/mycommand.sh (每小时的10-30分钟,每分钟执行一次命令脚本,共执行20次)

10,30 * * * * * root /usr/local/mycommand.sh (每小时的10,30分钟,分别执行一次命令脚本,共执行2次)

* * * * * 				每1分钟执行一次

15,30,45 * * * * 		每小时的第15、30、45分执行

15,30 10-11 * * * 		在上午10点到11点的第15和第30分钟执行

* */2 * * * 				每两个小时执行一次
chmod 777 /usr/local/mycommand.sh

systemctl restart crond.service 

超实用的Crontab使用实例

实例1:每1分钟执行一次root /usr/local/mycommand.sh

* * * * * root /usr/local/mycommand.sh

实例2:每小时的第3和第15分钟执行

3,15 * * * * root /usr/local/mycommand.sh

实例3:在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * root /usr/local/mycommand.sh

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2  *  * root /usr/local/mycommand.sh

实例5:每周一上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 root /usr/local/mycommand.sh

实例6:每晚的21:30重启smb

30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb

45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb

10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb

0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb

0 */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb

0 23-7/1 * * * /etc/init.d/smb restart

5、相关文件

#该文件中所列用户不允许使用crontab命令
	/etc/cron.deny
# 该文件中所列用户允许使用crontab命令
	/etc/cron.allow
#所有用户crontab文件存放的目录,以用户名命名
	/var/spool/cron/
# crond日志文件
	/var/log/cron

保存生效 加载任务,使之生效:

crontab /etc/crontab

查看任务

crontab -l
crontab -u 用户名 -l #列出用户的定时任务列表

注意:
crond的任务计划, 有并不会调用用户设置的环境变量,它有自己的环境变量,当你用到一些命令时,比如mysqldump等需要环境变量的命令,手工执行脚本时是正常的,但用crond执行的时候就会不行,这时你要么写完整的绝对路径,要么将环境变量添加到 /etc/crontab 中。

查看日志

tailf /var/log/cron

测试中的问题

1、关于重新加载配置文件

根据网上说的修改配置文件之后需要重新加载配置文件或者重启crond才能生效,测试过程中发现只要修改了配置文件即可生效,无需使用systemctl reload crond加载

2、crond报错
(CRON) DEATH (can’t lock /var/run/crond.pid, otherpid may be 8138): Resource temporarily unavailable

解决的各种姿势

3、在保存任务的时候提示 Do you want to retry the same edit? 这种情况下一定是你的crontab格式写错了,要注意细节呀,这个命令时间一长不经常使用也容易出错的。

1、杀掉所有crond进程,然后重启crond服务
2、检查你写的配置文件是否有错

温馨提示:本文最后更新于2021-10-16 14:19:14,某些文章具有时效性,若有错误或已失效,请在下方留言或联系CmdEye
© 版权声明
THE END
喜欢就支持一下吧
点赞13赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容