主要内容
crond和crontab
crond是一个守护进程,用于周期性地执行指定的任务。而crontab是一个用于管理这些周期任务的命令,例如添加、删除、查询任务等。
crond每分钟检查相关配置文件,以发现是否有任务被更新,因此crond执行任务的最小时间粒度也是以分钟为单位。
相关配置文件和目录
用户的权限
用户的权限有两种:分别是allow(允许)和deny(禁止)。
配置权限的文件为:
- /etc/cron.allow
- /etc/cron.deny
如果cron.allow文件存在,则用户必须添加进这个文件才可以执行cron任务;
如果cron.deny文件存在,则不在这个文件中的用户才能执行cron任务。
cron.allow的优先级高于cron.deny,如果两个文件同时存在,且用户同时在这两个文件中,则cron.allow中的优先生效。系统一般保留cron.deny文件,且该文件是一个空的文件,即默认允许所有人执行cron任务。
注意:root用户不受这些文件的限制,root用户任何时候都可以执行cron任务。当使用su命令提升权限的时候,最好配合-u参数指定执行cron任务的用户。
保存任务的路径
虽然没有明确区分,但cron任务分为系统任务和用户添加的任务。
系统任务保存路径:
- /etc/crontab 一个普通文件
- /etc/cron.d/ 一个目录
用户添加的任务保存到:
- /etc/spool/cron/
任务保存到以当前用户名为名称的文件下,假如当前下达cron任务的用户是jack,则他的任务保存到/etc/spool/cron/jack文件中。
cron运行记录
cron的执行日志会被记录到/var/log/cron文件当中。
任务的添加和crontab语法
添加任务
一般来说,我们不会直接通过编辑上面的配置文件来添加任务,而是使用crontab -e命令。
crontab -e命令执行后,会进入一个文本编辑模式,在这个模式下就可以进行任务的添加。例如,可以创建一个任务,在每天12点正执行,任务内容是提醒所有用户记得关闭电脑。
1 2 3 4 |
#使用crontab -e添加任务 crontab -e #命令执行后进入编辑模式 #然后添加以下内容 0 12 * * * wall "remember to shutdown your computer" |
crontab语法
crontab语法栏位
由6个栏位组成,它们分别是分钟、小时、日期、月份、周和命令,如下表:
栏位意思 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
可用值 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 需要执行的命令 |
上面的示例当中,0代表分钟,12表示小时,后面的三个星号分别代表日期、月份和周,最后wall命令开始到最后就是命令栏位。其中周的数值0和7都是表示星期天, 另外,命令中如果涉及文件处理,那么文件的路径必须使用绝对路径。
crontab语法中常见的符号
特殊字符 | 代表意思 |
*(星号) | 任意时候执行!如果日、月、周都是 * , 就表示“无论何月、何日的星期几的 12:00 都执行“ |
,(逗号) | 用于分隔时段。如:0 3,6 * * * command ,依然是六栏,不过第二栏是 3,6 ,表示在3时和6时执行 |
-(减号) | 在一个时间范围内,如:20 8-12 * * * command, 第二栏是 8-12 ,表示8时至12时,即 8,9,10,11,12 都执行 |
/n(斜杠) | n 代表一个数字,即每隔n个单位执行,如: */5 * * * * command,意思是每5分钟执行,也可以写成 0-59/5 |
再说crontab配置文件
crontab既是一个命令,也是一个配置文件。前面说过,crontab配置文件在/etc目录下面,主要保存系统的定期任务。相比普通用户的配置文件,crontab文件里面的栏位数目是7栏,在第五栏后面添加了一个执行用户的栏目。下面是crontab配置文件的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
因为root是拥有最高权限的用户,它可以指定使用任意用户执行任务,因此,多了一个user-name栏。
cron和anacron
anacron和cron一样,都是用于执行周期性的任务,但是,anacron并不是用于取代cron,而是cron的补充。cron的缺点是:已过期且还没有被执行的任务不会再被执行,过了就是过了。anacron就是为了弥补这个缺点出现的,它会定期执行任务检查,如果发现过期未被执行的任务,则会执行这些任务
anacron的启动方式
crond是一个守护进程,而anacron是一个普通的进程,它由cron启动,每小时一次。前面我们说过,cron会搜索/etc/cron.d目录,并执行里面的任务,而这个目录下面,有一个0hourly文件,添加了如下任务:
1 2 3 4 5 |
# Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly |
任务就是在每小时的第一分钟使用run-parts执行/etc/cron.hourly目录的可执行文件。run-parts的作用就是用于执行特定目录下面的可执行文件。
再来看一下/etc/cron.hourly目录,里面0anacron文件的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh # Check whether 0anacron was run today already if test -r /var/spool/anacron/cron.daily; then day=`cat /var/spool/anacron/cron.daily` fi if [ `date +%Y%m%d` = "$day" ]; then exit 0; fi # Do not run jobs when on battery power if test -x /usr/bin/on_ac_power; then /usr/bin/on_ac_power >/dev/null 2>&1 if test $? -eq 1; then exit 0 fi fi /usr/sbin/anacron -s |
重点是最后一行,就是这条命令启动了anacron进程, 上面脚本的作用是:检查最近运行的每日任务的日期,如果该日期等于当前日期,则正常退出,否则执行anacron -s
命令。
anacron配置文件
anacron运行的时候会读取/etc/anacrontab配置文件。该文件的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly |
anacrontab配置文件里面包含三种类型的字符串行:
- 变量定义
- 任务描述
- 空行
变量定义:用于定义执行任务的相关属性。例如RANDOM_DELAY=45,定义一个最大随机延迟时间,这里是45分钟;START_HOURS_RANGE=3-22, 任务会在3点至22点期间执行。
任务描述:任务描述的格式由4个栏位构成,它们分别是
- 执行周期
- 延迟时间
- 任务标识符
- 将要执行的命令
执行周期:可以是数字,也可以是一个宏,例如1表示一天,可以用宏@daily表示;7表示七天,即1周,可以用宏@weekly表示;月份因为有长有短,一般建议使用宏@monthly表示。
延迟时间:由两个部分构成:一个是配置文件中明确给出的时间,例如上面的5、25、45等,另一个是变量中设置的时间,把这两个时间相加,就是任务的执行延迟时间。
任务标识符:用于在日志文件中标识这个任务,尽量确保这个名称在日志中是唯一的即可。
一般来说一个任务只能写在一行,如果确实想换行,可以使用转义字符”\”(反斜杠)换行。
添加用户任务
从anacrontab配置文件中可以看见,anacron会执行/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly目录中的任务,如果想要添加用户任务,只需要把它们放到上面三个相对应的目录中即可。
禁用anacron进程
如果确实需要禁用anacron进程,只需要把0anacron任务添加进/etc/cron.hourly/jobs.deny目录即可,如果没有这个目录,自己创建一个。
创建每秒执行的任务
无论是cron还是anacron,它们的时间精度都是分钟,如果希望建立一个每秒执行的任务,建议使用脚本启动该任务,方法是函数的递归(当然循环也可以):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh declare -i flag=0 #累加器 taskRunInEverySecond(){ echo "hello world" #每秒输出一次"hello world" sleep 1 #关键语句,睡眠1秒 : $[ flag++ ] #每秒加一 if [ ${flag} -eq 10 ]; then #退出条件,运行10次后退出 exit 0 fi taskRunInEverySecond #递归执行函数自己 } echo "script begin executing.." taskRunInEverySecond |
转载请注明:Pure nonsense » 使用crontab执行周期任务