crond定时任务详解

mac2022-06-30  9

首先来了解一下chkconfig这个命令:

chkconfig命令检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

  参数:

     --add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据;

     --del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据;

       --level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。

等级代号列表: 等级0表示:表示关机 等级1表示:单用户模式 等级2表示:无网络连接的多用户命令行模式 等级3表示:有网络连接的多用户命令行模式 等级4表示:不可用 等级5表示:带图形界面的多用户模式 等级6表示:重新启动 chkconfig --list #列出所有的系统服务。

[root@learning ~]# chkconfig --list crondcrond 0:off 1:off 2:on 3:on 4:on 5:on 6:off

列出系统在每个执行等级中有没有执行crond服务

 

linux定时任务分为两种:

1.系统自身定期执行的任务(系统任务调度)

比如系统日志的轮询、备份系统数据、清除系统缓存等,可以通过vi配置/etc/crontab这个文件,它是一个纯文本文件,当然只有root能配置,修改完之后要通过/etc/init.d/crond   restart重启crond服务

[root@learning ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # 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,f ri,sat # | | | | | # * * * * * user-name command to be executed

2.用户执行的定时任务(用户调度任务)

  1)at:只适合执行一次就结束的突发性调度任务,依赖于服务------atd

  2)anacron:适合非7*24小时开机的服务器,是开机执行的调度任务,开机后会自动检测停机期间该执行而未执行的任务,在开机后一次性执行一遍

  3)crond:一个守护进程(即后台执行的进程),依赖于服务------crond,默认情况下每分钟检查系统中是否有要执行的定时任务,若有,则会根据事先定义好的规则执行这个任务,所以对于秒级的定时任务,crond自身是实现不了的,必须通过方法改进......    crond与crontab的区别:crond服务是运行的程序,而crontab是用户用来设置定时规则的命令,是一个执行文件------/usr/bin/crontab

    crondtab的语法:

        参数:  

          -u:指定在哪个用户下面编辑定时任务,默认不写为当前用户

          -e:修改定时任务,即ceontab文件的内容

          -l:查看定时任务,即ceontab文件的内容

          -r:移除定时任务,把当前用户的整个crontab文件删掉,一般不用,而是直接-e,取文件里面删除不要的内容

          -i:确认功能

          crontab -l/-e操作的是/var/spool/cron中的当前用户的crontab文件,即

                                                crontab -u root -l/-e == cat/vi /var/spool/cron/root

          当用户创建定时任务后,对应的配置文件会存在于/var/spool/cron/中,文件名与用户名一致

 

    用户的定时任务规则一般分为6列:

      1.minute【0~59]  hour【0~23】  day【1~31】  month【1~12】  week【0~7】  command

      2.week中0和7都为周日,也可以用sun,mon,tue,wed,thu,fri,sat来代替

      3.日和周尽量不要一起用

      4.符号:

*

表示任意时间都 (00 23 * * * cmd:每天23:00执行cmd)-时间范围,分割时段的范围/n

每n个时间单位,前面一般加*(*/5 * * * * cmd :每个五分钟执行一次cmd)

      5.举几个例子实践一下下:

例1:30  3,12  *  *  *  /bin/sh  /scripts/oldboy.sh

每天凌晨三点和中午十二点的半点时刻执行/scripts/oldboy.sh脚本

注:执行脚本文件时,要在前面加sh,并标明绝对路径(即/bin/sh),编写命令时尽量编写绝对路径,不容易出错,例如crond定时任务中,如果脚本不加绝对路径,默认回到用户家目录中寻找文件并执行

 

例2:30  */6  *  *  *  /bin/sh  /scripts/oldboy.sh

每个六小时的半点时刻执行脚本

 

例3:30  4  1,10,22  *  *  /application/apache/bin/apachetl graceful

每月的1,10,22日凌晨4:30重启Apache

 

例4:00  */1  *  *  *  /application/apache/bin/apachetl graceful

每隔一个小时重启Apache

 

 

扩展:

1.我们可以通过编辑 /etc/cron.deny和 /etc/cron.allow 这两个文件控制允许或者不允许文件中的用户使用crontab命令,/etc/cron.allow的优先级比较大,一般使用/etc/cron.deny,把不允许使用crontab命令的用户写进去就行啦

2.所有用户的配置文件默认存放在/var/spool/cron/目录中,文件名以用户名命名

3.一般在crond任务的命令脚本后面要加  >/dev/null  2>&1,相当于1>/dev/null  2>/dev/null,相当于 &>/dev/null

  /dev/null是一个空设备文件,不定位到/dev/null 会导致/var/spool/clientmqueue中的文件过多而inode被消耗尽

  为什么会导致这样的结果呢?原来。当一个定时任务被执行的时候,就会给系统发送一个邮件,我们可以在/etc/crontab中的MAILTO=root看到,邮件会发送给用户,但是sendmail邮件服务是经常性关闭着的,所以就会堆积在/var/spool/clientmqueue中,从而导致inode被耗光了,在centos6中,从rpm -qa|grep sendmail可以看出,没有安装sendmail;也没有安全/var/spool/clientmqueue,所以可以不用加 >/dev/null  2>&1

4.定时任务的执行最好用脚本,避免出错

转载于:https://www.cnblogs.com/xqr2018/p/8922248.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)