linux定时任务crontab 周期执行任务

1. crontab主要作用

比如我们每天需要清空日志记录文件,我们可以执行一段指令去完成,每天都需要手动输入就比较麻烦,让系统每天去帮我们完成就比较轻松了,
根据你自己的定义 可以定位到月 日 时 分 星期 ,
以前有个很有名的病毒 '黑色星期五'   
每到了周五就发作,计划任务和它一样的道理,只不过没有破坏性,

2. 如何添加crontab 定时任务

方式一:
]# crontab –e
# 每天早上5点运行 /root/bin/backup.sh
0 5 * * * /root/bin/backup.sh

方式二(不常用):
]# vi /etc/crontab
# 每天早上5点运行 /root/bin/backup.sh
0 5 * * * /root/bin/backup.sh

3. 计划任务,crontab命令选项:

 *      *      *      *       *        command
minute   hour    day   month   week      command
分        时      日     月      星期       命令
0-59     0-23    1-31   1-12     0-6     command `  

minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

Crontab 选项
以下是 crontab 的有效选项:
crontab -u : 指定一个用户。
crontab –e : 修改 crontab 文件. 如果文件不存在会自动创建。 
crontab –l : 显示 crontab 文件。 列出某个用户的任务计划,
crontab -r : 删除 crontab 文件。列出某个用户的任务计划,
crontab -ir : 删除 crontab 文件前提醒用户。

4. cron文件语法:

可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

    "*"代表取值范围内的数字,

    "/"代表"每",

    "-"代表从某个数字到某个数字,

    ","分开几个离散的数字

举例如下:

5 * * * * ls /*指定每小时的第5分钟执行一次ls命令*/ 
30 5 * * * ls /*指定每天的 5:30 执行ls命令*/ 
30 7 8 * * ls /*指定每月8号的7:30分执行ls命令*/ 
50 7 * * * root run-parts /etc/cron.daily /*每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件*/
每五分钟执行  */5 * * * *

每小时执行     0 * * * *

每天执行        0 0 * * *

每周执行       0 0 * * 0

每月执行        0 0 1 * *

每年执行       0 0 1 1 *

5. 查看计划任务

查看调度任务
crontab -l //列出当前的所有调度任务

     crontab -l -u jp   //列出用户jp的所有调度任务

实例1:

(1)在当前家目录下创建shell脚本123.sh(实现排序)如下

     #!/bin/bash
    arr=(1 5 4 5 6 7 0)
    for (( i=0 ; i<${#arr[@]} ; i++ ))
    do
          for (( j=${#arr[@]} - 1 ; j>i ; j-- ))
          do
        #echo $j
        if  [[ ${arr[j]} -lt ${arr[j-1]} ]]
        then
           t=${arr[j]}
           arr[j]=${arr[j-1]}
           arr[j-1]=$t
        fi
      done
    done
echo "排序后:"
echo ${arr[@]}                  

(2)输入crontab -e 添加计划任务(不指定用户就是当前用户)

    第一次会让你选择编译器,如果选错编译器了要更改编译器  输入   select-editor 重新选择

    ubuntu截图用shift+PrintScreen 选择 ’复制到剪切板‘ 就可以了

我选的是vim ,看个人习惯

(3)在文本最后输入我们要执行的shell脚本命令

* * * * * 代表每分钟执行一次

按esc 输入:wq 保存退出

(4)重启cron服务:

service cron restart

(5)查看结果

用户家目录下查看任务有没有执行,如果执行了应该是有pa.txt文件的(任务有重定向到文件)

查看文件内容

如果你要周期执行python脚本,你只需要把脚本写好,然后将cron那里的执行命令写成 python3 脚本目录文件名就可以

比如 :

* * * * *  python3 ~/hello.py >  123.txt

总结:

linux中将一个脚本文件作为一个计划任务小结,以python脚本为例:

1 创建脚本文件test.py,在文件开头需要加上下面一行

#!/usr/bin/python

上面这行的作用是说明使用那个解释器来执行该文件,如果不知道python解释器在哪,可以使用命令which python来查看

2 给该文件添加可执行的权限

chmod +x test.py

3 添加计划任务

crontab -e

在文件中追加一行,*/2 * * * * /usr/bin/python /home/pc/work/ENV/project/test.py

保存退出,:wq

4 重启cron服务

service cron restart

常用命令:

cron的配置文件称为“crontab”,是“cron table”的简写

  service crond start //启动服务
  service crond stop //关闭服务
  service crond restart //重启服务
  service crond reload //重新载入配置
  service crond status //查看服务状态

要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可

查看当前用户的crontab,输入 crontab -l;

编辑crontab,输入 crontab -e;

删除crontab,输入 crontab -r

查看crontab运行状态
service crond status

crontab踩坑(二):Unit crond.service could not be found.

这是因为Ubuntu上的服务名称是cron不是crond。所以你的命令应该是:

sudo service cron start

6. 示例

# 在 12:01 a.m 运行,即每天凌晨过一分钟。这是一个恰当的进行备份的时间,因为此时系统负载不大。
1 0 * * * /root/bin/backup.sh

# 每个工作日(Mon – Fri) 11:59 p.m 都进行备份作业。
59 11 * * 1,2,3,4,5 /root/bin/backup.sh

# 下面例子与上面的例子效果一样:
59 11 * * 1-5 /root/bin/backup.sh

# 每5分钟运行一次命令
*/5 * * * * /root/bin/check-status.sh

# 每个月的第一天 1:10 p.m 运行
10 13 1 * * /root/bin/full-backup.sh

# 每个工作日 11 p.m 运行。
0 23 * * 1-5 /root/bin/incremental-backup.sh

# 每隔一分钟执行一次脚本 /opt/bin/test-cron.sh
*/1 * * * * root  /opt/bin/test-cron.sh

# 每周六、周日的3点10分执行hello程序。
10 3 * * 0,6 hello

# 从周四到周六的4点15分执行hello程序。
15 4 * * 4-6 hello

# 每周日凌晨4点,更新系统
0 4  * * 0     root emerge --sync && emerge -uD world    

#每月1号凌晨2点,清理/tmp下的文件
0 2 1 * *     root   rm -f /tmp/*

#每年5月6日给robin发信祝他生日快乐
0 8 6 5 *   root     mail  robin < /home/galeki/happy.txt

假如,我想每隔2分钟就要执行某个命令,或者我想在每天的6点、12点、18点执行命令,诸如此类的周期,可以通过 “ / ” 和 “ , ” 来设置:
# 每两分钟就执行
*/2   *   *   *   *   hello

# 每天6点、12点、18点执行hello
0 6,12,18   *   *   *   hello

# 晚上11点到早上8点之间每两个小时,早上八点执行一个命令
0 23-7/2,8 * * * echo "have a good dream:)" >> /tmp/test.txt

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

# 每晚的21:30重启apache。
30 21 * * * /usr/local/etc/rc.d/lighttpd restart

# 每月1、10、22日的4 : 45重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

# 每周六、周日的1 : 10重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

# 每天18 : 00至23 : 00之间每隔30分钟重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

# 每一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart

# 晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

# 在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup

# 周一到周五每天下午 5:00 寄一封信给
0 17 * * 1-5 mail -s "hi"  < /tmp/maildata

# 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"

# 每天早上6点10分
10 6 * * * date

# 每两个小时
0 */2 * * * date

# 晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date

# 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date

# 1月份日早上4点
0 4 1 jan * date
posted @ 2020-01-16 17:51  HaimaBlog  阅读(525)  评论(0编辑  收藏  举报