• 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



  • 相关阅读:
    滚轮选择器效果 封装类
    我的第一个博客——Fragment遇到的问题
    LeetCode#11 Container With Most Water
    LeetCode#5 Longest Palindromic Substring
    LeetCode#3 Longest Substring Without Repeating Characters
    邮件协议
    六、应用层——文件传输协议FTP
    六、应用层——DNS
    平衡二叉树
    二叉树的性质
  • 原文地址:https://www.cnblogs.com/softidea/p/5042536.html
Copyright © 2020-2023  润新知