一、Linux 系统自有服务 crond
crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,一般操作系统默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
二、计划任务的作用
操作系统不可能24 小时都有人在操作,有些时候想在指定的时间点去执行任务。例如:每天凌晨 2 点去重新启动httpd服务,此时不可能真有人每天夜里 2 点去执行命令,这就可以交给计划任务程序去执行操作了。
三、crontab 命令
选项 | 作用 |
---|---|
-l | list,列出指定用户的计划任务列表 |
-e | edit,编辑指定用户的计划任务列表,简单来说,计划任务就是一个文件 |
-u | user,指定的用户名,如果不指定,则表示当前用户 |
-r | remove,删除指定用户的计划任务列表 |
四、编辑计划任务(!)
使用crontab -e
打开计划任务编辑文件后,即可编写我们的自定义计划任务。
计划任务语法,以行为单位,一行即为一个计划任务
分 时 日 月 周 用户名(可省略) 计划任务需要执行的命令
取值范围(常识):
分:0~59
时:0~23
日:1~31
月:1~12
周:0~7,0 和 7 都表示星期天
四个符号:
*:表示取值范围中的每一个数字
-:做连续区间表达式的,要想表示1~7,则可以写成:1-7
/:表示每多少个,例如:想每 10 分钟一次,则可以在分的位置写:*/10
,:表示多个取值,比如想在 1 点,2 点 6 点执行,则可以在时的位置写:1,2,6
在Linux系统中,有些命令不能直接在计划任务中使用,使用后,其也不会生效。如useradd命令。如果想让其生效必须使用完整路径。
案例一:每月1、10、22 日的4:45 重启network 服务
45 4 1,10,22 * * /usr/bin/systemctl restart network
案例二:每周六、周日的1:10 重启network 服务
10 1 * * 6,7 /usr/bin/systemctl restart network
案例三:每天18:00 至23:00 之间每隔30 分钟重启network 服务
*/30 18-23 * * * /usr/bin/systemctl restart network
案例四:每隔两天的上午8 点到11 点的第3 和第15 分钟执行一次重启
3,15 8-11 */2 * * /usr/sbin/reboot
五、crontab 权限
crontab是任何用户都可以创建的计划任务,但是超级管理员可以通过配置来设置某些用户不允许设置计划任务 。
1)黑名单
配置文件位于:/etc/cron.deny
里面写用户名,一行只能写一个
使用vim编辑该文件保存退出之后,现在我们切换到 hsforpyp 普通用户,执行crontab -e
命令,如下图所示:
可以看到,hsforpyp 普通用户不被允许使用 crontab 命令。
2)白名单
/etc/cron.allow
(本身不存在,自己创建)
白名单优先级高于黑名单,如果一个用户同时存在两个名单文件中,则会被默认允许创建计划任务。白名单使用频率不高,一般使用黑名单即可。
3)查看计划任务文件保存路径
问:计划任务文件具体保存在哪里呢?
答:/var/spool/cron/用户名文件中
,如果使用root用户编辑计划任务,则用户文件名为root
4)查看计划任务日志信息
问:在实际应用中,我们如何查看定时任务运行情况?
答:通过计划任务日志,日志文件位于/var/log/cron
六、一次性定时执行任务
☆ 安装at命令
# yum install at -y
☆ 启动底层服务
# systemctl start atd
# systemctl enable atd
☆ 案例演示
案例一:三天后下午5点执行/bin/ls
# at 5pm+3 days
at>/bin/ls >/root/readme.txt
at>按Ctrl+D
# am = 上午、pm = 下午、3 days = 3天
案例二:明天17点,输出时间到指定的文件中
# at 17:00 tomorrow
at>date>/root/readme.txt
at>按Ctrl+D
案例三:使用atq查看没有执行的计划任务
# atq
atq = at + q = at命令 + query查询
案例四:删除指定的计划任务
# atq
# atrm 任务号
atrm = at + rm = at + remove