一.crontab命令介绍
crontab命令的功能是给定的计划周期内执行给定的命令。
crontab命令的参数:
Options:
-u <user> define user #用来设定某个用户的crontab服务,例如,“-u abc”表示设定abc用户的crontab服务,此参数一般有root用户来运行。crontab -u abc -e
-e edit user's crontab #编辑当前用户的crontab任务
-l list user's crontab #显示当前用户的crontab任务
-r delete user's crontab #从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i prompt before deleting #在删除用户的crontab文件时给确认提示
-n <host> set host in cluster to run users' crontabs
-c get host in cluster to run users' crontabs
-s selinux context
-x <mask> enable debugging
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
二.crontab涉及的配置文件
1. /etc/crontab
/etc/crontab文件这个文件一般用来安排由系统管理员制定的维护系统以及其他任务的crontab
[root@centosclient ~]# cat /etc/crontab
SHELL=/bin/bash #指定命令执行的环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root #当发生错误时,邮件发送root用户
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59) # minute - 从0到59的整数
# | .------------- hour (0 - 23) #hour - 从0到23的整数
# | | .---------- day of month (1 - 31) #day - 从1到31的整数 (必须是指定月份的有效日期)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... #month - 从1到12的整数 (或如Jan或Feb简写的月份)
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat #dayofweek - 从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
# * * * * * user-name command to be executed # user-name - 需要以什么用户身份执行root表示以root用户身份来运行 command - 需要执行的命令
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
对于以上各语句,星号(*)表示所有可用的值。例如*在指代month时表示每月执行(需要符合其他限制条件)该命令。整数间的连字号(-)表示整数列,例如1-4意思是整数1,2,3,4,指定数值由逗号分开。如:3,4,6,8表示这四个指定整数。符号“/”指定步进设置。“/”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务。以“#”开头的为注释行,不会被执行。
除了root用户之外的用户可以执行crontab配置计划任务。所有用户定义的crontab存储在目录/var/spool/cron下,任务会以创建者的身份被执行。要以特定用户创建一个crontab,先以该用户登录,执行命令crontab -e,系统会启动在指定的的编辑软件编辑crontab。文件内容与/etc/crontab格式相同。示例如下:
0 3 * * * /home/dbbackup/db1backup.sh backup
0 4 * * * /home/dbbackup/db2backup.sh backup
- 1
- 2
表示每天3点执行/home/dbbackup/db1backup.sh backup,4点执行/home/dbbackup/db2backup.sh backup,如果是每五分钟执行一次可改为: shell
*/5 * * * * /home/dbbackup/db2backup.sh backup
当更改的crontab需要保存时,文件会保存在成如下文件/var/spool/cron/username。文件名会根据用户名而不同。
cron服务会每分钟检查一次/etc/crontab、/etc/cron.d/、/var/spool/cron文件下的变更。如果发现变化,就会下载到存储器中。因此,即使crontab文件改变了,程序也不需要重新启动。推荐自定义的任务使用crontab -e命令添加,退出后用/etc/init.d/crond restart命令重启crond进程,官方文件说不用重启进程,run-parts是指后面跟着的是文件夹。
2./var/spool/cron/
这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。该文件是由crontab -e命令创建的。
3.cron.allow与cron.deny
crontab权限问题到/var/adm/cron/下检查文件cron.allow和cron.deny是否存在
用法如下:
1)如果两个文件都不存在,则只有root用户才能使用crontab命令。
2)如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
3)如果cron.allow不存在,cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令, 其它用户都能使用。
4)如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。
AIX 中 普通用户默认都有 crontab 权限,如果要限制用户使用 crontab ,就需要编辑/var/adm/cron/cron.deny
HP-UNIX 中默认普通用户没crontab 权限
三.crontab涉及的服务
使用ps -ef | grep cron来查看cron进程
[root@centosclient cron.d]# ps -ef |grep cron
root 4460 1 0 Jan01 ? 00:00:00 /usr/sbin/crond -n
root 5575 3581 0 00:17 pts/0 00:00:00 grep --color=auto cron
- 1
- 2
- 3
使用service crond status查看状态
[root@centosclient cron.d]# service crond status
Redirecting to /bin/systemctl status crond.service
crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled)
Active: active (running) since Mon 2018-01-01 23:49:29 PST; 28min ago
Main PID: 4460 (crond)
CGroup: /system.slice/crond.service
└─4460 /usr/sbin/crond -n
Jan 01 23:49:29 centosclient systemd[1]: Starting Command Scheduler...
Jan 01 23:49:29 centosclient systemd[1]: Started Command Scheduler.
Jan 01 23:49:29 centosclient crond[4460]: (CRON) INFO (RANDOM_DELAY will be ...)
Jan 01 23:49:29 centosclient crond[4460]: (CRON) bad username (/etc/crontab)
Jan 01 23:49:29 centosclient crond[4460]: (CRON) INFO (running with inotify ...)
Jan 01 23:49:29 centosclient crond[4460]: (CRON) INFO (@reboot jobs will be ...)
Jan 01 23:59:01 centosclient crond[4460]: (*system*) RELOAD (/etc/crontab)
Hint: Some lines were ellipsized, use -l to show in full.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
新版本的linux可以使用systemctl status crond.service来查看
service crond start //启动服务 或者systemctl start crond.service
service crond stop //关闭服务 或者systemctl stop crond.service
service crond restart //重启服务 或者systemctl restart crond.service
service crond status //查看服务状态 或者systemctl status crond.service
- 1
- 2
- 3
- 4
四.crontab任务编写规则
1.需要执行的系统级别任务,直接编辑/etc/crontab文件,注意需要指定用户。
2.用户级别任务,不用指定用户,可以使用命令crontab -e来打开当前用户的crontab任务列表,按照格式编辑任务条目,编辑完之后保存,在/var/spool/cron/ 目录下面的以相关用户名命名的文件内会同步保存之前编辑的文件。
也可以按照格式编辑一个文件,比如c.cron,然后使用命令crontab c.cron将c.cron内的任务提交到crontab进程中。注意,这种方式会将之前的crontab任务直接替换掉,而不是新增。
五.crontab任务编写示例
- 每五分钟执行
*/5 * * * * command
- 1
- 每小时执行
0 * * * * command
- 1
- 每天执行
0 0 * * * command
- 1
- 每周执行
0 0 * * 0 command
- 1
- 每月执行
0 0 1 * * command
- 1
- 每年执行
0 0 1 1 * command
- 1
- 每1分钟执行
* * * * * command
- 1
- 每小时的第3和第15分钟执行
3,15 * * * * command
- 1
- 在每天上午的8点到11点的第3和第15分钟执行
3,15 8-11 * * * command
- 1
- 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command
- 1
- 每个周一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command
- 1
- 每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt
- 1
注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
13. 每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
- 1
- 晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt
- 1
- 每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
- 1
- 晚上11点到早上7点之间,每隔一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
- 1
- 一月一号的4点重启smb
0 4 1 jan * /etc/init.d/smb restart
- 1
- 每小时执行/etc/cron.hourly目录内的脚本
01 * * * * root run-parts /etc/cron.hourly
- 1
- 每月的4号与每周一到周三的11点重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
- 1
- 每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
- 1
- 每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
- 1
- 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点执行
0 11 4 * 1-3 command line
- 1
- 每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
- 1
- 每小时执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly
- 1
- 每天执行/etc/cron.daily内的脚本
02 4 * * * root run-parts /etc/cron.daily
- 1
- 每星期执行/etc/cron.weekly内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
- 1
- 每月去执行/etc/cron.monthly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly
- 1
注意: “run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。
内容参考下面的博文
https://www.cnblogs.com/longjshz/p/5779215.html
https://www.cnblogs.com/peida/archive/2013/01/08/2850483.html