zoukankan      html  css  js  c++  java
  • linux的自动化操作相关使用方法汇总 专题

    Crontab中的除号(slash)到底怎么用?

    crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要注意的地方呢?

    在定时任务中,我们经常有这样的需求,比如每5分钟查看一下日志,我们可以这么写:

    0,5,10,15,20,25,30,35,40,45,50,55 * * * * /command

    这样肯定是没有问题的,但是就写书写起来非常复杂,简化一下可以这么写:

    0-55/5 * * * * /command

    这样的写法已经简化了很多,大家还是觉得麻烦,那么可以这样写:

    */5 * * * * /command

    怎么样,是不是非常简单明了。这句就表示在0,5,10,15,20,25,30,35,40,45,50,55分钟的时候执行命令,即每隔5分钟执行命令。

    由此我们得出除号与范围搭配使用,表示命令执行的步长。

    那么我下面这种写法,是否标示每13分钟执行一次命令呢?

    */13 * * * * /command

    这里就是需要注意的地方。有一些步长是无法用这种方式表达的。只有能够被整除的步长值才能表达与我们理解相一致确切的含义,
    对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,
    对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12,
    对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月与平闰年。
    这是因为 cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行。

    而对于*/13这个例子来说,表示在分钟这个范围内,即0-59分钟,任务会每13分钟执行一次。即:0,13,26,39,52,之后再间隔8分钟,就会又重新执行。

    再看下面一个例子:

    0 6 */2 * * /command

    看到这个我们如果理解成每xx执行就是,每两天的6点钟执行命令。在这里*的范围是1-31,*/2表示任务在奇数天执行,那么在1、3、5、7、8、10、12月,月末最后一天执行后,紧接着第二天仍然后执行,那这就不是每2天执行一次。


    参考资料:

    2、Man 5 crontab

    http://www.cnblogs.com/cocowool/p/5865397.html

    https://www.cnblogs.com/cocowool/archive/2009/04/22/1441291.html

    linux系统的web网站在运营状态时,我们常需要对网站进行维护,例如查看资源剩余并做出响应、日志分割、数据整理,在特定状态执行特定任务等等,这些都会需要linux能实现自动执行某些任任务。本篇博文介绍如何进行常见的linux自动化任务。

    实现“自动化”有如下好处:

    1. 节省人力,一个脚本就够了。
    2. 在夜晚自动执行可以避开网站流量高峰期,不影响网站白天的效率。
    3. 准确,设置完善的情况下,不会出差错。
    4. 当然最重要的还是省心了,不用频繁的敲某些命令了。

    开机启动

    开机启动应该是我们很经常的需求了,我们常需要在开机时就自动执行某些命令来开启服务,进程等,有了它我们不必再在每次开机时输入同一堆命令。

    chkconfig命令

    使用chkconfig命令可以在设置在不同启动级别下启动特定的服务或是程序。

    先说一下linux的运行级别:

    • 等级0表示:表示关机
    • 等级1表示:单用户模式
    • 等级2表示:无网络连接的多用户命令行模式
    • 等级3表示:有网络连接的多用户命令行模式
    • 等级4表示:不可用
    • 等级5表示:带图形界面的多用户模式
    • 等级6表示:重新启动

    chkconfig的命令如下:

    chkconfig --list //命令查看已设置的开启自启动列表。
    xxxd 0:off 1:off 2:on ... 6:off //list的结果,表示在xxxd服务在启动级别为2 3 4 5 的情况下会自动启动。 
    chkconfig --add xxxd//向任务列表中添加一个xxxd服务
    chkconfig [--level 1/2/../6] xxxd on/off//设置xxxd用服务在n状态为开/关,[]内省略则在2345级别开启
    chkconfig --del xxxd //将任务列表中的xxxd服务删除
    

    rc.d文件的编辑

    也可以直接编辑/etc/rc.d/目录下的文件来实现开机自启动。此目录下有很多文件,rcn.d是在启动状态为n的情况下的启动文件夹,rc、rc.sysinit、init.d都是系统的模块或系统设置的自启文件[夹]。

    我们用vim rc.local 编辑 rc.local文件,来定制自己的自启计划。命令十分简单,就像平常在操作一样。如/usr/local/apache/bin/apachectl start表示开机自启动apache服务器。


    at实现定时任务

    at是一个简单的功能简单的定时任务程序,它只能进行一次性的定时任务,其用法如下:

    #at time      //at加时间启动at命令
    at>operation    //输入要执行的操作
    at>Ctrl+D      //按Ctrl+D退出命令编辑
    

    其time的常见形式如下

    at H:m tomorrow     //第二天的H点m分
    at now + n minutes/hours/days/weeks  //在n分/时/天/周后
    at midnight         //在午夜=-=
    at H:m pm/am        //在当天上午/下午的H点m分
    

    我们也可以在/var/spool/at文件中查看at的当前命令。还需要注意的是,linux默认atd进程关闭状态,需要手动打开。


    crontab实现定时任务

    linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。

    cron介绍

    cron守护进程是一个由实用程序和配置文件组成的小型子系统,在几乎所有类 UNIX 系统上都可以找到某种风格的cron,我们可以用ps aux|grep cron找到crond这个守护进程。

    我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

    • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
    • /etc/crontab 这个文件负责调度各种管理和维护任务。
    • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
    • 我们还可以把脚本放在/etc/con.hourly、/etc/con.daily、/etc/con.weekly、/etc/con.monthly目录中,让它每小时/天/星期、月执行一次。

    crontab的使用

    我们常用的命令如下:

    crontab [-u username]    //省略用户表表示操作当前用户的crontab
        -e      (编辑工作表)
        -l      (列出工作表里的命令)
        -r      (删除工作作)
    

    我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

    crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有

    • * 取值范围内的所有数字
    • / 每过多少个数字
    • - 从X到Z
    • 散列数字

    以下是几个例子。

    时间                  注释
    0 0 25 12 *     //在12月25日的0时0分
    */5 * * * *     //每过5分钟
    * 4-6 * * *     //每天的4 5 6点
    * * * * 2,5     //每周二和周五
    

    配合简单的shell脚本

    如果我们的命令有逻辑判断等非常复杂的操作时,再直接编辑crontab就有点困难了,这时,我们可以使用shell脚本。其来历,分类定义与题不符,不再多说,我们直接说它的用法。

    我们用vim /usr/sh/test.sh来使用vim编辑一个shell脚本

    #!/bin/sh           //声明开始shell脚本
    a = "hello world"   //定义一个shell变量
    echo $a             //熟悉的echo,输出a变量
    

    然后crontab -e编辑crontab,添加 */5 * * * * /usr/sh/test.sh每隔五分钟运行一次test.sh脚本,也可以用 /phppath/php /filepath/test.php 来用php进程来执行php程序。

    如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。

    Crontab的格式

    第1列分钟1~59
    第2列小时1~23(0表示子夜)
    第3列日1~31
    第4列月1~12
    第5列星期0~6(0表示星期天)
    第6列要运行的命令

    下面是crontab的格式:
    分 时 日 月 星期 要运行的命令

    这里有crontab文件条目的一些例子:

    30 21 * * * /usr/local/apache/bin/apachectl restart
    上面的例子表示每晚的21:30重启apache。

    45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
    上面的例子表示每月1、10、22日的4 : 45重启apache。

    10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
    上面的例子表示每周六、周日的1 : 10重启apache。

    0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
    上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

    0 23 * * 6 /usr/local/apache/bin/apachectl restart
    上面的例子表示每星期六的11 : 00 pm重启apache。

    0 */1 * * * /usr/local/apache/bin/apachectl restart
    每一小时重启apache

    #20160912修正,感谢@张琼的指正,之前写错了,*/1和*表示的同样的意思,对于 / 的用法,可以参考另一篇文章 Crontab中的除号到底怎么用?

    0 23-7/1 * * * /usr/local/apache/bin/apachectl restart
    晚上11点到早上7点之间,每隔一小时重启apache

    0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
    每月的4号与每周一到周三的11点重启apache

    0 4 1 jan * /usr/local/apache/bin/apachectl restart
    一月一号的4点重启apache

    https://www.cnblogs.com/cocowool/archive/2009/04/22/1441291.html


    http://www.cnblogs.com/zhenbianshu/p/5042303.html

    转自:http://blog.csdn.net/ustcgy/article/details/5275096

    1.Cron的启动与关闭

    由于Cron是Linux的内置服务,可以用以下的方法启动.关闭这个服务:

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

    2.Cron配置文件

    2.1全局配置文件

    crontab在/etc目录下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五个目录和crontab,cron.deny二个文件.

    cron.daily是每天执行一次的job,cron.weekly是每个星期执行一次的job.cron.monthly是每月执行一次的job,cron.hourly是每个小时执行一次的job.cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面.

    /etc/crontab文件一般如下:

    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

    我们可在此文件中添加自己需要的cron job.

    /etc/cron.deny文件就是用于控制不让哪些用户使用Crontab的功能.

    2.2用户配置文件

    每个用户都有自己的cron配置文件,通过crontab -e 就可以编辑,一般情况下我们编辑好用户的cron配置文件保存退出后,系统会自动就存放于/var/spool/cron/目录中,文件以用户名命名.

    linux的cron服务是每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的内容.

    3.Cron命令格式

    crontab [ -u user ] 文件 
    crontab [ -u user ] { -l | -r | -e }

    -u:指定某一用户

    -e:执行文字编辑器来设定用户(当前用户或指定用户)时程表,内定的文字编辑器是vi.
    -r:删除用户时程表.
    -l:列出用户时程表.

    4.Cron文件格式

    *  *  *  *  *  command
    分 时 日 月 周   命令

    第1列表示分钟1~59, 每分钟用*或者 */1表示
    第2列表示小时1~23(0表示0点)
    第3列表示日期1~31
    第4列表示月份1~12
    第5列标识号星期0~6(0表示星期天)
    第6列要运行的命令

    5.Cron文件使用说明

    5.1 一般情况

    当f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其余类推. 

    * * * * * /bin/usershell  每天每分钟执行一次/bin/usershell
    当f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推.

    0-12 * * * * /bin/usershell  每天每小时从0到12分钟每分钟执行一次/bin/usershell
    当f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推.

    * */2 * * * /bin/usershell  每天每2小时执行一次/bin/usershell
    当f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推.

    * 1,3,5,7 * * * /bin/usershell  每天每逢1,3,4,7点执行一次/bin/usershell

    5.2. 冲突逻辑

    日期可以用月限定,也可以用“星期”指定,如果两个段有冲突,那么,第六段的命令将在匹配任何一个的情况下都运行,比如

    "30 4 1,15 * 5",将在每月的1号和15号加每个周五,上午4:30运行.

    5.3. 符号"%"

    "%"在Cron文件中,有"结束命令行","换行","重定向"的作用,假如不需要"%"的特殊作用,需要使用转义符转义.

    5.4. @reboot

    这个不需要理解,为了达到在开机后运行,且只运行一次的目的.除了这个,也无法通过前五段的设置来实现.

    @annually也是这个功能.

    至于@yearly,@monthly等等其实都可以用上面的五段来设置.

    然后我自己写了一个小例子做了下测试:

    使用crontab -e进行编辑,内容为:

    */2 * * * * echo "i am crontab" >> /home/zhang/hello

    这样隔两分钟就会往hello这个文件里写i am crontab

    我自己写了一个脚本task.sh,直接运行task.sh时可以运行,可是加到crontab里就有运行了,后来我查看了网上的解决方法,终于解决了,先来看一下我原来写的task.sh脚本吧:

    #!/bin/sh

    java -jar offergateway.biz.offer-1.0-SNAPSHOT.jar

    crontab定时任务的写法为:

    * * * * *  /task.sh

    后来我查了网上说要运行crontab,必须使用绝对路径,然后我把路径都改成绝对路径了。

    在crontab的执行环境变量中,没有相应用户设置的环境变量,你需要手动设置一下环境变量,才能让它生效。于是我把上面的脚本改成:

    #!/bin/sh

    . /etc/profile

    java -jar /home/zhang/offergateway.biz.offer-1.0-SNAPSHOT.jar

    crontab也改成绝对路径:

    * * * * *  sh /home/zhang/task.sh

    哈哈,成功了~~happy~~

    http://li200429.iteye.com/blog/1608758



  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/softidea/p/5042536.html
Copyright © 2011-2022 走看看