多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] 1. Linux有个三种方式 **/etc/cron.d** , **/etc/crontab文件**和**crontab -e**,遇到的很多黑客攻击都会用定时来不断的摧残我们的系统。 2. cron服务的最低检测时间单位是分钟,所以cron会每分钟读取一次/etc/crontab与/var/spool/cron中的数据内容,因此,编辑完/etc/crontab文件并且保存之后,crontab时设定就会自动执行。 **3. cron执行时,也就是要读取三个地方的配置文件:一是/etc/crontab,二是/etc/cron.d目录下的所有文件,三是每个用户的配置文件. ** ## **1. /etc/crontab文件** ### **1.1这种设置定时任务的方法,只限于root用户(用于root给自己与其他用户分配定时任务)** ``` root@ubuntu01:~# ll /etc/crontab -rw-r--r-- 1 root root 420 Nov 8 18:25 /etc/crontab ``` 如上,只有root有权修改这个文件。 ### **1.2创建定时任务** ``` * * * * * <用户> <commond> :给某一用户创建定时任务 ``` ``` root@ubuntu01:~# vim /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command */2 * * * * root echo "dd" >> /root/test ``` ### **1.3.这种方式,通过`crontab -l`是*不能显示用户的定时任务的*** ``` root@ubuntu01:~# crontab -l no crontab for root ``` ### **1.4直接删除定时任务的那行就可以停止定时任务** ### **1.5 centos与Ubuntu的区别** #### 1.5.1 Ubuntu的/etc/crontab ``` root@ubuntu02:~# vim /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) ``` #### 1.5.2 centos的 /etc/crontab ``` [root@localhost ~]# vi /etc/crontab 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 ``` ### 1.5.3说明 1.Ubuntu的文件多出了几行`25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )`这种东西 2.run-parts --report /etc/cron.daily ://每天执行/etc/cron.hourly内的脚本,run-parts代表执行目录中的脚本,不加的话要指定执行的脚本了,而不是目录。 3.难道centos就没有类似的这种文件吗?有: ``` [root@localhost etc]# ls | grep cron anacrontab cron.d cron.daily cron.deny cron.hourly cron.monthly crontab cron.weekly ``` ## **2.crontab -e** **1.这种所有用户都可以使用,普通用户也只能为自己设置计划任务 2.然后自动将定时任务写入/var/spool/cron/crontabs/username** ### **2.1创建定时任务** ``` tuna@ubuntu01:~$ crontab -e # Edit this file to introduce tasks to be run by cron. ... # # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */1 * * * * echo "I am tuna,hello!" > ~/tuna.txt ``` ### **2.2查看定时任务** ``` tuna@ubuntu01:~$ crontab -l # Edit this file to introduce tasks to be run by cron. # ... # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command */1 * * * * echo "I am tuna,hello!" > ~/tuna.txt ``` ### **2.3删除定时任务** 执行下边的命令后,自动删除属于当前用户的定时任务 ``` crontab -r ``` ## 3. /etc/cron.d ``` SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 发生错误会给/var/spool/mail/root发送email */1 * * * * root /root/test.sh ``` ## 4. crontab的限制 ``` /etc/cron.allow:将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab; /etc/cron.deny:将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab 。 ``` 如果有需要,使用其中一种方式即可 ### 3.1 实例 ``` root@ubuntu01:~# cat /etc/cron.deny tuna test ``` ## **5.anacron** 1.anacron并不能取代cron去运行某项任务,而是以天为单位或者是在启动后立刻进行anacron的动作,**它会去侦测停机期间应该进行但是并没有进行的crontab任务,并将该任务运行一遍**后,anacron就会自动停止了。 **2.anacron运行的时间通常由两个,一个是系统启动期间运行,一个是写入crontab的排程中,这样才能够在特定时间分析系统未进行的crontab工作。** **3.anacron的配置文件是/etc/anacrontab** ``` [root@localhost cron.hourly]# vi /etc/anacrontab # /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 ``` **4.anacron命令的语法如下:** (1)-s开始连续的运行各项工作,会一句时间记录当的数据判断是否进行。 (2)-f强制进行,而不去判断时间登录档的时间戳。 (3)-n立即进行未进行的任务,而不延迟等待时间。 (4)-u仅升级时间记录当的时间戳,不进行任何工作。 而anacron的配置文件是/etc/anacrontab,而它的很多内容则是在/var/spool/anacron里面保存。 **5.当anacron下达anacron -s cron.daily时,它会有如下的步骤:** (1)由/etc/anacrontab分析到cron.daily这项工作名称的天数为一天。 (2)由/var/spool/anacron/cron.daily取出最近一次运行anacron的时间戳。 (3)把取出的时间戳与当前的时间戳相比较,如果差异超过了一天,那么就准备进行命令。 (4)若准备进行命令,根据/etc/anacrontab的配置,将延迟65分钟。 (5)延迟时间后,开始运行后续命令,也就是run-parts /etc/cron.daily这串命令。 (6)运行完毕后,anacron程序结束。 **6. crontab调用anacron** 1)/etc/cron.d/0hourly /etc/cron.d目录 cron进程执行时,就会自动扫描该目录下的所有文件,按照文件中的时间设定执行后面的命令。 ``` [root@localhost cron.d]# vi 0hourly #nacron Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly ``` 2)/etc/cron.hourly ``` [root@localhost cron.hourly]# ls 0anacron [root@localhost cron.hourly]# vi 0anacron #!/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 //调用 ``` 如上脚本所示,会按照天去检查是否有未执行的定时任务