关于crontab定时任务命令解读
作者:为什么要做囚徒
一、crontab概述
crontab:
是一个用于管理、编辑和查询用户定时任务的命令行工具。通过 crontab 命令,用户可以添加、修改、删除和列出定时任务,以实现自动化执行特定任务。cron:
是一个在后台运行的系统服务,负责按照预设时间规则来执行指定的定时任务。cron 守护进程会在任务所指定的时间到达时自动执行相应的命令或脚本文件,并将执行结果记录在日志文件中。
因此,crontab 主要用于管理和维护定时任务的配置信息,而 cron 则负责实际执行这些定时任务。
需要注意的是,在某些 Linux 发行版中,cron 和 crontab 可能被打包成同一个软件包,并且往往默认安装在系统中。
因此,在使用 crontab 命令之前,建议先确认系统是否安装了 cron 服务。
总之,cron 和 crontab 都是用于管理和维护定时任务的重要工具和服务,它们的作用互补且不可替代。
二、crontab安装
yum install cronie
三、crontab常用操作命令
1.启动、关闭以及状态查看
# 状态查看 systemctl status crond # 启动 systemctl start crond # 关闭 systemctl stop crond # 重启 systemctl restart crond
2.列出当前用户的所有定时任务
crontab -l
3.编辑当前用户的定时任务
crontab -e
运行上述命令后,会打开一个文本编辑器,可以在其中输入要执行的命令和时间规则。
格式如下:
* * * * * command
其中,五个星号分别表示分钟、小时、日、月、周几,command 表示要执行的命令或脚本文件路径。
例如,以下是每天凌晨 3 点执行 /backup.sh 脚本的定时任务配置:
0 3 * * * /backup.sh
4.删除当前用户的所有定时任务
crontab -r
5.查看帮助信息
crontab -h
需要注意的是,crontab 命令只适用于当前用户。
如果需要编辑其他用户的定时任务,需要使用 root 权限。
可以使用以下命令来切换到 root 用户,并编辑指定用户的定时任务:
su - crontab -u username -e
其中,username 表示要编辑定时任务的用户名。
总之,在 CentOS 中,可以使用 crontab 命令来添加、修改和删除定时任务。
可以使用 crontab -e 命令编辑当前用户的定时任务,crontab -u username -e 命令编辑其他用户的定时任务,并且可以使用 crontab -l 和 crontab -r 命令查看当前用户的定时任务列表和删除所有定时任务。
四、添加定时任务
在 Linux 系统中,可以使用两种方法来新增调度任务:
1. 使用 crontab -e 命令
可以使用 crontab 命令来添加、编辑和删除当前用户的定时任务。具体步骤如下:
- 运行命令
crontab -e
,进入 crontab 编辑器; - 在编辑器中添加要执行的任务,例如:
* * * * * echo "hello world" >> /home/tmp.txt
; - 保存并退出编辑器,此时新增的定时任务就会生效。
需要注意的是,crontab 命令只能用于当前登录用户的定时任务管理。
2. 直接编辑 /etc/crontab 文件
可以直接编辑 /etc/crontab 文件来新增系统级别的定时任务。具体步骤如下:
- 使用 root 权限运行命令
vi /etc/crontab
,打开 /etc/crontab 文件; - 在文件末尾添加要执行的任务,例如:
* * * * * root echo "hello world" >> /home/tmp.txt
;必须指定用户,要不然不执行 - 保存并关闭文件,此时新增的定时任务就会生效。
需要注意的是,直接编辑 /etc/crontab 文件新增的定时任务是针对系统级别的,可以被所有用户共享。同时,如果需要修改或删除该任务,也需要使用 root 权限进行操作。
无论是使用 crontab 命令还是直接编辑 /etc/crontab 文件,都需要设置正确的时间规则和要执行的命令。同时,还需要注意文件的格式和编码方式,避免出现语法错误或者乱码等问题。
以上两种方式都无需重启或加载,直接生效
注意:当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1
即可,如:
`* * * * * root echo "hello world" >> /home/tmp.txt > /dev/null 2>&1`
五、时间格式详解
# 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
时间格式如下:
t1 t2 t3 t4 t5 program
其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一个星期中的第几天。program 表示要执行的程序。
- 当 t1 为 * 时表示每分钟都要执行 program,t2 为 * 时表示每小时都要执行程序,其余类推
- 当 t1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,t2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
- 当 t1 为 */n 时表示每 n 分钟个时间间隔执行一次,t2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
- 当 t1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,t2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推
示例如下:
// 每月最后一天定时执行一次 0 0 L * * // 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "hello world": 20 0-23/2 * * * echo "hello world"
六、使用异常记录
1./etc/crontab方式添加的定时任务不执行
# 不执行 * * * * * echo "hello world" >> /home/tmp.txt; # 执行 必须指定用户 * * * * * root echo "hello world" >> /home/tmp.txt;
2.如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
- 所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
- 在 shell 脚本开头使用以下代码:
#!/bin/sh . /etc/profile . ~/.bash_profile
- 在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。