如何使用 linux 定时运行命令—crontab

时间:2022-11-18 08:01:56

一 ,首先介绍一下crontab

      任务调度的crond常驻命令
      crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类:
       1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存.
       2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置.

      系统调度的任务一般存放在/etc/crontab这个文件下,里面存放了一些系统运行的调度程序,通过命令我们可以看一下里面的内容:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
      这些任务都会是系统在运行起来后自动进行调度的。同时在/etc目录下还存放了/etc/cron.deny 和 /etc/cron.allow 文件
      /etc/cron.deny 表示不能使用crontab 命令的用户
      /etc/cron.allow 表示能使用crontab的用户。
      如果两个文件同时存在,那么/etc/cron.allow 优先。
      如果两个文件都不存在,那么只有root用户可以安排作业。

     

二 , crontab的常用命令

       安装crontab:
       yum install crontabs


       说明:
       /sbin/service crond start //启动服务
       /sbin/service crond stop //关闭服务
       /sbin/service crond restart //重启服务
       /sbin/service crond reload //重新载入配置
    

       查看crontab服务状态:service crond status

       手动启动crontab服务:service crond start
       
查看crontab服务是否已设置为开机启动,执行命令:ntsysv

       加入开机自动启动:
       chkconfig –level 35 crond on

      crontab -e  编辑crontab

      crontab -l  查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本 

      crontab -r  删除当前的crontab


三,crontab的语法及其使用方法

         语法:

     * * * * * command path  // 前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
          调度命令的规则:

字段名称 说明 取值范围
分钟 每小时的第几分钟执行 0-59
小时   每日的第几个小时执行 0-23
日期 每月的第几天执行 1-31
月历 每年的第几月执行 1-12
星期 每周的第几天执行 0-6
命令名称 欲执行的命令及参数  

crontab命令中的一些常用特殊符号:

符号  说明
* 表示任何时刻
, 表示分割
表示一个段,如第二段里: 1-5,就表示1到5点
/n 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.


如何使用

第一步:

写cron脚本文件,命名为crontest.cron。例如:

15,30,45,59 * * * * echo "crontest....." >> crontest.txt     表示,每隔15分钟,执行打印一次命令 


第二步:

添加定时任务。执行命令 “crontab crontest.cron”,大功告成


第三步:

"crontab -l" 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本


Notice:crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件,/var/spool/cron下的crontab文件不可以直接创建或者直接修改,该crontab文件是通过crontab -e命令创建的


几个例子:

每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt      //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11点到早上8点之间每两个小时和早上八点
0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line


周一到周五的 9:00 执行

0 9 * * 1-5  command line


1月1日早上4点
0 4 1 1 * command line SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/

每小时(第一分钟)执行/etc/cron.hourly内的脚本
01 * * * * root run-parts /etc/cron.hourly

每天(凌晨4:02)执行/etc/cron.daily内的脚本
02 4 * * * root run-parts /etc/cron.daily

每星期(周日凌晨4:22)执行/etc/cron.weekly内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly

每月(1号凌晨4:42)去执行/etc/cron.monthly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly

注意: "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。

*******************


以下为转载

六、几个问题

crontab 编辑:
输入编辑命令: crontab -e

# m h  dom mon dow   command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh

Ctrl + O (写入)——》enter键(保存文件名)——》Ctrl + X(退出) 

输入查看命令: crontab -l

# m h  dom mon dow   command
SHELL=/bin/bash
30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh
建议使用此方式

语法错误:

Syntax error: "(" unexpected 

参见: LINUX - BASH Syntax Error

或者,crontab -e 时指定shell解释器(sh):SHELL=/bin/bash(请参见上面 crontab编辑 示例)


路径错误:

在 /var/spool/crontab/yanggang 中,添加了如下命令,在日志文件 /var/spool/mail/yanggang 中提示找不到 xxx.sh 路径

30 * * * *  /home/barry/top800/top10/top10_fruits/top10_all.sh

30 * * * * bash /home/barry/top800/top10/top10_fruits/top10_all.sh

这是因为你在crontab中使用了绝对路径执行脚本 top10_all.sh,因此在脚本 top10_all.sh 中引用的其它脚本也都需要使用绝对路径,才能被crontab找到并执行

如何避免绝对路径复杂的设置呢,如上文 六、几个问题  所示,采用如下格式:

30 * * * * cd /home/barry/top800/top10/top10_fruits/ && ./top10_all.sh建议使用此方式,先进入该目录,然后在执行脚本;否则,执行脚本中的其它脚本都需要加绝对路径


参考地址:http://blog.csdn.net/ithomer/article/details/6817019 

                    http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/06/3002602.html