Linux计划任务at命令、crontab命令
前言环境:centos 7.9Linux的计划任务就和Windows的计划任务一样,可以设置系统在哪个时间执行什么命令或脚本,比如在凌晨的时候对数据库进行备份等工作。at命令(一次性计划任务)at命令是一次性执行命令,也就是说这个命令设置的计划任务就执行一次就消亡了,at命令是由atd服务提供的,atd.service服务是开机自启服务。语法格式:atHH:MM yyyy-mm-ddcommand
前言
环境:centos 7.9
Linux的计划任务就和Windows的计划任务一样,可以设置系统在哪个时间执行什么命令或脚本,比如在凌晨的时候对数据库进行备份等工作。
注意
设定或执行计划任务之前最好看一下服务器时间是否正常。
at命令(一次性计划任务)
at命令是一次性执行命令,也就是说这个命令设置的计划任务就执行一次就消亡了,at命令是由atd服务提供的,atd.service服务是开机自启守护进程服务。
at命令语法格式:
at HH:MM yyyy-mm-dd
> command
> Ctrl+D
或
at HH:MM yyyy-mm-dd -f filename #文件必须是可执行权限,而且应该写绝对路径
演示示例:
[root@master ~]# at 14:36 2021-10-7 -f /root/at.sh #文件必须是可执行权限,而且应该写绝对路径
job 7 at Thu Oct 7 14:36:00 2021
[root@master ~]# atq
7 Thu Oct 7 14:36:00 2021 a root
[root@master ~]#
第一个格式是指定时间后按enter回车键,再输入命令,然后按Ctrl+D来提交任务,第二个格式是通过参数-f来指定执行的脚本文件,脚本文件必须是能使用sh来执行的具有可执行权限的文件,而且应该写绝对路径。
atq #查询当前设置的at任务列表,等价于at -l
at -l #查询当前设置的at任务列表,等价于atq
atrm n #删除指定任务编号的at任务,同at -d n命令,编号通过atq或at -l就能查得到
at -d n #删除指定任务编号的at任务,同atrm n命令,编号通过atq或at -l就能查得到
at -c n #查看指定编号的任务的具体内容
at计划任务文件位置
默认目录:/var/spool/at/
每创建一个at计划任务默认就会在/var/spool/at/目录里创建一个文件,文件以a开头的,当任务执行完毕后,文件也随之消失。
拒接其他人创建at计划任务
root用户想要拒接其他用户使用at命令创建计划任务,则可以使用/etc/at.deny文件来实现,编辑该文件直接输入用户名即可,这样该用户使用at命令时就会报错不具备权限。
crontab命令(周期性计划任务)
不会写可以去这个网站生成计划任务:https://crontab.guru/
.
crontab命令是周期性执行命令,也就是说这个命令设置的计划任务可以周而复始的在指定的时间内执行,这跟Windows的计划任务是一样的,crontab命令是由crond.service提供的,crond.service也是开机自启服务。
命令格式:crontab 选项
-l 列出指定用户的计划任务列表
-e 编辑指定用户的计划任务列表
-u 指定用户名,如果不指定,则默认当前用户
-r 删除指定用户的计划任务
通常,我们会使用crontab -e 进入脚本编辑模式来编辑计划任务,如下:
[root@Centos8 ~]# crontab -e
这样就进入了计划任务编辑页面,这和vim一样的,编辑计划任务是有一定格式的,如下 讲解。
计划任务的编辑语法格式
语法格式:
分 时 日 月 周 需要执行的命令
取址范围:
分:0-59
时:0-23
日:1-31
月:1-12
周:0-7,其中0或7都可以表示星期天
4个符号:星号* 中杠行线 - 斜杠/ 道号,
* 星号表示取址范围中的每一个数字,如表示0-23小时中的每个小时则就用星号表示
-横杆代表连续区间表达式,如1到7可以表示:1-7
/斜杠表示每间隔多少个,如任务每隔十分钟执行一次,则可以在分的位置写:*/10
,英文的道号表示多个取值,如想在1点,2点,6点执行则可以在时的位置这样写:1,2,6
计划任务演示示例
计划任务1:每月1、10、22日的4:45重启httpd服务
45 4 1,10,22 * * /usr/bin/systemctl restart httpd
计划任务2:每周六,周日的1:10分重启httpd服务
10 1 * * 6,0 /usr/bin/systemctl restart httpd
计划任务3:每天18:00指23:00之间每隔30分钟重启httpd服务
*/30 18-23 * * * /usr/bin/systemctl restart httpd
计划任务4:每隔两天的上午8:00到11:00的第15分钟和第45分钟执行重启httpd服务
15,45 8-11 */2 * * /usr/bin/systemctl restart httpd
计划任务5:每天凌晨0:00进行mysql数据库备份(备份脚本已写好)
0 0 * * * /usr/bin/bash mysql_backup.sh
注意事项:
1、crontab -e 进入脚本编辑,一行就表示一个计划任务,需要多少个计划任务就写多少行。
2、命令必须使用绝对路径来表示,如:/bin/bash mysql_back.sh 使用which 命令 或 whereis 命令 来定位命令的绝对路径
3、书写计划任务时,命令的标准输出或错误输出都是不会直接输出到屏幕上的,如:*/1 * * * * date 此计划任务将不会输出日历都屏幕上,正确的写法应该是重定向到文件。
计划任务文件的默认位置/var/spool/cron/
计划任务文件的默认位置:
/var/spool/cron/
下有一个与用户名相同的文件,该文件就是保存crontab -e
编辑定时任务生成的文件,直接编辑该计划任务文件实质上等价于 crontab -e
,所以,有经验的运维工程师都是直接编辑该文件的/var/spool/cron/root
。
计划任务的日志文件
默认日志文件位置:/var/log/cron /var/log/cron-xxxxxxxx tail -22f /var/spool/mail/root
/var/log/cron 就是当天的计划任务日志,日志文件以cron开头后面接日期则是之前的日志,查看该日志文件可以得知计划任务是否执行成功
crontab 权限问题
crontab本身是允许任何用户都可以创建自己的计划任务,但root超级用户可以通过配置来指定哪些用户不具有crontab权限,即不允许哪些用户设置计划任务,其配置文件在:/etc/cron.deny
从文件名字就能看出是拒绝用户计划任务权限,其书写格式很简单:写用户名,一行一个。
crontab与% 问题
%在crontab中属于特殊字符,所以在书写crontab命令时如果需要使用使用%,请使用反斜杠\将百分号转译,如:
* * * * * /usr/bin/tar -zcf /tmp/etc-$(date +"\%Y\%m\%d\%H\%M\%S").tar.gz /etc #或者下面这样把命令写在文件里
* * * * * sh /root/tar_etc.sh #tar_etc.sh正常写脚本内容:/usr/bin/tar -zcf /tmp/etc-$(date +"%Y%m%d%H%M%S").tar.gz /etc
更多推荐
所有评论(0)