• linux crontab 计划任务 atd和windows下的计划任务


    crontab 命令

    如果发现您的系统里没有这个命令,请安装下面两个软件包.

    vixie-cron

    crontabs

    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。 

    常用参数:

    crontab   -l   //查看当前用户下的cron任务

    crontab -e  //编辑当前用户的定时任务

    其实就是编辑/var/spool/cron下面的用户文件,比如用户名为ad,就有个ad文件。

    crontab -u  linuxso  -e  //编辑用户linuxso的定时任务

    具体用法和格式:

     

    基本格式 :
    *  *  *  *  *  command
    分 时 日 月 周 命令

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

    crontab文件的一些例子:

    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每晚的21:30重启apache。

    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每月1、10、22日的4 : 45重启apache。

    10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每周六、周日的1 : 10重启apache。

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

    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每星期六的11 : 00 pm重启apache。

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

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

    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    每月的4号与每周一到周三的11点重启apache

    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    一月一号的4点重启apache

    名称 : crontab

    使用权限 : 所有使用者

    使用方式 :

    crontab file [-u user]-用指定的文件替代目前的crontab。

    crontab-[-u user]-用标准输入替代目前的crontab.

    crontab-1[user]-列出用户目前的crontab.

    crontab-e[user]-编辑用户目前的crontab.

    crontab-d[user]-删除用户目前的crontab.

    crontab-c dir- 指定crontab的目录。

    crontab文件的格式:M H D m d cmd.

    M: 分钟(0-59)。

    H:小时(0-23)。

    D:天(1-31)。

    m: 月(1-12)。

    d: 一星期内的天(0~6,0为星期天)。

    cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量

    说明 :

    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定

    user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设

    定自己的时程表。

    参数 :

    crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数

    来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

    crontab -r : 删除目前的时程表

    crontab -l : 列出目前的时程表

    crontab file [-u user]-用指定的文件替代目前的crontab。

    时程表的格式如下 :

    f1 f2 f3 f4 f5 program

    其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执

    行的程序。

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

    当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

    当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

    当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

    使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

    例子 :  资料整理 www.linuxso.com   Linux安全网

    ● 0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache

    ● 50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务

    ● 50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务

    ● 0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘

    ● 1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件

    ● 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} /;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
    ● 30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令

    #每天早上7点执行一次 /bin/ls :

    0 7 * * * /bin/ls

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

    0 6-12/3 * 12 * /usr/bin/backup

    周一到周五每天下午 5:00 寄一封信给 alex@domain.name :

    0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

    每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"

    20 0-23/2 * * * echo "haha"

    注意 :

    当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之

    后加上 > /dev/null 2>&1 即可

    例子2 :

    #每天早上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

    范例

    $crontab -l 列出用户目前的crontab.

    http://www.linuxso.com/command/crontab.html

     1、循环执行的计划任务
     linux下面有atdcrond两种计划任务,其中,atd服务使用的at命令只能执行一次,而crond服务使用的crontab定义的命令,是循环作用的,所以crond才符合我们的要求。
     crontab支持两种状态:一、直接编写计划任务;二、使用目录的方式,放在目录里面的都会定时执行。

    2、可以使用的用户
     默认情况下,系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过下面两个文件限制权限:

    引用
    ◆/etc/cron.allow:
    将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不能使用 crontab;
    ◆/etc/cron.deny:
    将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用 crontab 。


    ※类似TCPWrapper定义的方式。

    3、直接使用crontab编辑计划任务:
    命令:
    crontab [-u username] [-l|-e|-r]
    参数:


    -u  :通过-u帮其它使用者建立/移除 crontab;
    -e  :编辑 crontab 的内容
    -l  :查看 crontab 的内容
    -r  :移除 crontab 的所有内容(是全部的内容,如果只是删除某个,用-e编辑即可)


    内容格式:

    * *  *  *  * 命令
    前面的五个*号,表示分、时、日、月、周,如:
    代表意义 分钟 小时 日期 月份 周 
    数字范围 0-59 0-23 1-31 1-12 0-7
    *号代表任何时间都接受的意思,任意。
    *号之间用空格分开,如果是一段范围,用-号连接;如果是隔开几个时间,用,号表示。
    另外,命令必须是编写计划任务的用户有权限执行的,并且最后用绝对路径。

    cron表达式详解:

    http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html

    http://blog.csdn.net/tiwen818/article/details/6988105

    http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

    http://blog.csdn.net/hailongge/article/details/4931930
    例如:

    #crontab -e
    59 23 1 5 * mail linuxing < /home/test.txt
    每在5月1日,23点59分就把/home/test.txt的内容作为邮件发给linuxing用户
    */5 * * * * /opt/test.sh
    每5分钟就执行一次/opt/test.sh脚本
    0 3,6 * * * /usr/local/bin/test.sh
    每在3点和6点整点都执行/usr/local/bin/test.sh命令
    0 8-12 * * * /root/backup.sh
    8 点到 12 点之间的每小时的0分都执行/root/backup.sh



    4、基于目录的方式执行计划任务
     对于系统的计划任务,已经在/etc/crontab里面定义,采用的就是基于目录的方式。系统会定时读取该文件,并根据里面的定义执行命令。
     可以使用vi直接编写/etc/crontab文件,其中格式如下:

    #cat /etc/crontab
    SHELL=/bin/bash  #使用的shell
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  #预定义的PATH路径
    MAILTO=root   #出现问题发Email给该用户
    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   #每个月1号
    分 时 日 月 周 执行者身份  命令



     可以看到前面的五个参数的定义和直接编辑计划任务是一样的,增加了执行的用户定义和run-parts参数。
     run-parts后面跟的是目录名称,例如:/etc/cron.hourly,表示每小时01分就到/etc/cron.hourly目录中执行目录下的所有可执行文件;当然,目录是可以自己定义的。
     如果你需要增加系统的计划任务,只需要在对应的目录添加执行文件即可,例如:我需要在每天都执行updatedb的操作,则我只需要把/usr/bin/updatedb的执行命令链接到/etc/cron.daily目录就可以了。

    ※同样的,如果不需要使用目录的方式,也可以使用如下的方式:

    02 01 * * *   root     /root/test.sh
    也就是没有了run-parts,后面就直接跟命令的绝对路径



    5、注意事项
    如果使用crontab编辑计划任务或直接修改/etc/crontab文件后,计划任务没有生效,可能需要重启一下crond服务:service crond restart
    ◆当编写/etc/crontab文件的时候,不要漏了指定执行计划任务的用户,这是和直接用crontab -e编辑不同的。
    ◆某用户(如root)用crontab -e编辑的计划任务存放在/var/spool/cron/root,这个文件下。但最好不要直接编辑他,因为crond执行的时候,会在/tmp目录中建立需要的临时文件,直接编辑会对此有影响,甚至出错。
    ◆cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

       atd服务

    如果你的计划任务只要执行一次,那么就请你使atd服务。在默认情况下,Linux系统是开启了atd这个服务的。如果不确认你的Linux是否开启了atd服务,请使用下面这个命令查看:

          # /etc/init.d/atd status

          atd (pid  3016) 正在运行...

    从上面可以看出atd服务是启动的。如果你的atd服务没有启动可以使用

          # /etc/init.d/atd start

    来启动你的atd服务。

    atd服务中我们经常要使用到的是at命令与at命令相关的有/etc/at.deny /etc/at.allow两个文件用来过滤哪些用户可以使用at命令。Linux 预设情况下,只有/etc/at.deny 这个文件,且这个文件内容为空,由于内容没有任何使用者,所以所有人都可以使用at命令。如果不想要某个使用者使用at时,那么将该使用者登录用户名写到/etc/at.deny 这个文件中即可。

    Linux系统中还可以自行创建/etc/at.allow文件,使得写在这个文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at ( 即使没有写在at.deny 当中)。如果这两个文件都不存在,那么只有root可以使用at命令。

          下面来看一下如何使用at命令:

           at [-m]  TIME     //下达计划任务,之后会出现编辑窗口,写入要执行的命令

          -m :执行 at 计划任务时,将屏幕输出结果mail给下达指令的使用者。

          TIME的格式具体请参照我下面的列子吧。

          # at 04:00 2011-09-20  //2011920号上午四点执行命令。

          # at 11pm                    //今天晚上11点执行,如果已经过了,等到明天晚上

          # at 08am + 3 weeks  //三周后的上午八点执行

          此外还有两个常用命令:

           atq         ;     //查看计划任务

           atrm        ;     //删除计划任务

    实例:

    [root@localhost ~]#at 13:08 2014-03-27

    at> date >/root/2013.log         

    at> <EOT> (按ctrl+d结束)

    job 7 at 2014-03-27 13:08

    [root@localhost ~]#

    windows下没有crontab这个命令,参考http://stackoverflow.com/questions/707184/how-do-you-run-a-crontab-in-cygwin-on-windows

    windows下有2个计划任务命令:

     at 和schtasks。

    http://technet.microsoft.com/zh-cn/library/cc738335(v=ws.10).aspx

    计划任务每 20 分钟运行一次

    下面的命令计划安全脚本 Sec.vbs 每 20 分钟运行一次。该命令使用 /sc 参数指定分钟计划,使用 /mo 参数指定时间间隔为 20 分钟

    由于该命令没有包含开始日期或时间,因此任务在命令完成 20 分钟后启动,此后在系统运行时每 20 分钟运行一次。请注意,安全脚本源文件位于远程计算机上,但任务在本地计算机上计划并执行。

    schtasks /create /sc minute /mo 20 /tn "Security Script" /tr \centraldatascriptssec.vbs

    /tn为task name任务名称,每个任务名称必须唯一。

    每个一分钟启动notepad:

    schtasks /create /sc minute /mo 1 /tn "Security Script" /tr  C:WindowsSystem32 otepad.exe

    参考微软官方:http://technet.microsoft.com/zh-cn/library/cc772785(v=ws.10).aspx#BKMK_create

    更多:

    http://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800

    进入vi编辑模式,写入如下:
    */60 * * * * top -b -n1|head -10 >> /usr/moniterlog 2>&1
    (每个小时将top10 追加到文件中)
     


    系统的job就放在 /etc/crontab 下,一般不会去编辑它...,一般用户也可以用命令 crontab -e 可以在 /var/spool/cron/username里创建一个crontab文件哦,

    crontab -u 用户名 -l      (用root用户执行以这条命令就可以了,想看谁的看谁的)
    root查看自己的crontab设置:crontab l    crontab u root l    # -u 参数默认可缺省执行后输出结果相同

    crontab –e

    /1 * * * *

    echo "Hello world."

    wq

    "/tmp/crontab.XXXXqrVcET" 2L, 32C written

    crontab: installing new crontab

    "/tmp/crontab.XXXXqrVcET":1: bad minute

    errors in crontab file, can't install.

    Do you want to retry the same edit?

    Enter Y or N

     

    这样就无法保存crontab任务,更就无法执行crontab指令,不断的提示你重新修改,说明你crontab命令格式错误。

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

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

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

    11早上4 0 4 1 1 *

    编辑完某个用户的crontab计划任务后,crontab自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的crontab信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。crontab启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

     

    5、编辑/etc/crontab 文件配置cron

    cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

    SHELL=/bin/bash

    PATH=/sbin:/bin:/usr/sbin:/usr/bin

    MAILTO=root      #如果有数据输出不管正确还是错误,数据都会作为邮件发给这个帐号默认为root

    HOME=/    #执行者使用crontab的路径,默认是/ 目录

     

    # run-parts

     

    01 * * * * root run-parts /etc/cron.hourly #每小时执行/etc/cron.hourly内的脚本

    02 4 * * * root run-parts /etc/cron.daily #每天执行/etc/cron.daily内的脚本

    22 4 * * 0 root run-parts /etc/cron.weekly #每星期执行/etc/cron.weekly内的脚本

    42 4 1 * * root run-parts /etc/cron.monthly #每月去执行/etc/cron.monthly内的脚本

    #注意:这个配置文件,网上有帖子说这个文件可以直接使用crontab命令格式来写入所需执行内容的,但我经过测试后发现无法实现,crontab l无法查到计划任务,但配置文件确实被修改了,重启服务后也不生效,还有篇帖子说"run-parts"这个参数如果去掉,然后输入自己需要执行的shell脚本就可以执行了,我修改过执行时间,备份好该文件后,删除原文件的“run-parts”参数,然后加上自己的shell脚本路径,发现并么生效,重新加载服务后也一样,这一点也是通过测试得出的结论,所以,只有用crontab e 用来修改更新/var/spool/cron文件才能直观的现计划任务;

     crontab文件位置:

    Linux在相应用户下,用crontab -l 命令可以查看该用户定时执行的任务,-e可以编辑,但是其真实文件在哪儿呢??
    以CentOS为例,其真实的位置在:/var/spool/cron下面,有执行定时任务的用户将会有以该用户命名的一个文档,vim该文档与用命令crontab -l看到的一样。

    crontab命令

    crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。

    在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设 有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的 时间。

    然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:

    cr
    ontab test.cron

    这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容可以发现文件头有三行信息:

    #DO NOT EDIT THIS FILE -edit the master and reinstall.

    #(test.cron installed on Mon Feb 22 14:20:20 1999)

    #(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)

    大概意思是:

    #切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。

    #test.cron文件安装时间:14:20:20 02/22/1999

    如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。

    可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存 在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只 允许超级用户使用该命令,也可能是所有用户都可以使用该命令。

    crontab命令的语法格式如下:

    crontab [-u user] file

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

    第一种格式用于安装一个新的crontab 文件,安装 淳褪莊ile所指的文件,如果使用“-”符号作为文件名,那就意味着使用标准输入作为安装来源。

    -u 如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项,crontab 将默认是操作者本人的crontab ,也就是执行该crontab 命令的用户的crontab 文件将被修改。但是请注意,如果使用了su命令再使用crontab 命令很可能就会出现混乱的情况。所以如果是使用了su命令,最好使用-u选项来指定究竟是哪个用户的crontab文件。

    -l 在标准输出上显示当前的crontab。

    -r 删除当前的crontab文件。

    -e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。

    6.Crontab的两个关键的权限控制文件

    crontab指令默认所有用户都可以执行,为了降低对服务器的负载和资源有效利用,我们有必要禁止普通用户实用该命令批量或定时执行任务计划;那么,一定关系到以下两个文件

    /etc/cron.deny                 /etc/cron.allow

    cron.deny文件是该服务默认生成的,用于控制用户权限,只要用户写入某普通用户的用户名,那么该用户将无法使用crontab命令来执行任务计划

    cron.allow 文件是需要管理员手工创建的,该文件的作用是只有该文件里写入的用户才可以执行crontab,这个类似于我们的iptables规则,先默认全部deny,然后再放允许权限,这样可以有效的规范网络内部安全。cron.allow文件也为cron服务普通用户登陆限制的控制文件,不同cron.deny的是当crontab指令查询到cron.allow文件存在时,就不再匹配cron.deny文件了,当cron.allow为空时默认所有普通用户无法使用crontab指令执行任务计划

    crontab深入

    Linux cron运行原理

    http://my.oschina.net/daquan/blog/483305

    一种奇怪的现象

    crontab执行某些进程启动不了,但是手动启动脚本可以?

    什么原因?

    最后找到了,执行命令需要从path查找依赖的lib和so。

    我用root身份默认载入了/etc/profile,但是crontab没有。我手动在脚本前面加上:


    . /etc/profile

  • 相关阅读:
    vmwear 及docker
    vue相关
    vue demo
    线程的死锁
    让出和守护线程
    join加入线程
    线程的优先级
    线程间的通信
    synchronized关键字的使用
    线程的并发
  • 原文地址:https://www.cnblogs.com/youxin/p/3584145.html
Copyright © 2020-2023  润新知