zoukankan      html  css  js  c++  java
  • crontab

    【介绍:】

    linux 系统则是由 cron (crond) 这个系统服务来控制的。这个系统服务是默认启动的。 Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

    crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,liunx默认会安装此服务 ,并且会自动启动crond进程。

    【crond服务】

    安装crontab:yum install crontabs

    服务操作说明:

    /sbin/service crond start //启动服务

    /sbin/service crond stop //关闭服务

    /sbin/service crond restart //重启服务

    /sbin/service crond reload //重新载入配置

    /sbin/service crond status //启动服务

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

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

    【调度任务:】

    Linux下的任务调度分为两类:系统任务调度、用户任务调度

    系统任务调度:系统周期性所要执行的工作,在/etc/crontab文件里可以看到系统任务调度的配置文件。

    内容如下:

    前四行是用来配置crond任务运行的环境变量:

    第一行SHELL变量指定了系统要使用哪个shell,这里是bash

    第二行PATH变量指定了系统执行命令的路径

    第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户

    第四行的HOME变量指定了在执行命令或者脚本时使用的主目录,默认没有

    用户任务调度:用户定期要执行的工作,所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

    文件:/etc/cron.deny 表示不能使用crontab 命令的用户

    文件:/etc/cron.allow 表示能使用crontab的用户。

    如果两个文件同时存在,那么/etc/cron.allow 优先,如果两个文件都不存在,那么只有超级用户可以安排作业。

    文件:/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名

    用户编写任务:

    作用:

    通过crontab 命令,可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。非常设合周期性的日志分析或数据备份等工作。

    命令格式:

    crontab [ -u user ] file  或  crontab [ -u user ] { -l | -r | -e } 两种方式

    命令解释:

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

    file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

    -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)。

    -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

    -r:删除目前的时程表,从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

    -i:在删除用户的crontab文件时给确认提示。

    编写自己的定时任务:

    第一种方式:通过crontab文件方式

    第一步:创建一个名为rootcron的文件,添加内容,保存退出;第二步:通过$ crontab rootcron命令提交

    # (put your own initials here)echo the date to the console every

    # 15minutes between 6pm and 6am

    0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

    第二种方式:编辑crontab文件

    如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

    $ crontab -e

    可以像使用v i编辑其他任何文件那样修改crontab文件并退出。

    例如,加入下面的一条:

    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

    30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} ;

    备份crontab

    使用命令:$ crontab -l 列出crontab文件 如下类似的内容:

    0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

    通过 $ crontab -l > $HOME/mycron 这种方法在$ H O M E目录中对crontab文件做一备份

     删除crontab文件

    要删除crontab文件,可以用:$ crontab -r

    恢复丢失的crontab文件

    误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:$ crontab <filename>其中,<filename>是你在$ H O M E目录中副本的文件名。

    有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。

    查看已经执行过的任务

    看 /var/log/cron这个文件就可以,可以用tail -f /var/log/cron观察

    【使用实例】

     在文件(提交的文件 或 者crotab文件)中添加的命令必须以如下格式:

       * * * * * /command path

     解释添加的内容:

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

    前5个字段分别表示:分钟:0-59; 小时:1-23; 日期:1-31;月份:1-12;星期:0-6(0表示周日);还有一些特殊符号:

           *: 表示任何时刻,含义就是每隔该段的单位时间,都执行。所以一般分钟段都会写一个数字,表示该分钟时刻会执行一次,如果设置为*则每分钟都执行。

           ,: 表示分割,例如a, b, c,... 时表示第 a, b, c,... 要执行

      -:表示一个段,如第二段里: 1-5,就 表示1到5点,例如a-b  表示从第 a 到第 b 都要执行

           /n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.------可以表示每隔几分钟,每隔几小时,每隔几天,每隔几个月。如果不设置的话其实也有每隔的含义,只不过就是相应进制的每隔。比如:分钟是60分;小时是24小时;日期是31天,或者说是下个月的第几号;月份是12个月;星期是星期。

    & 后台执行命令

      1. 当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。

        如:30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &

      2.在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

      3.放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

            如:command >out.file 2>&1 &

       在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

     【2>&1 含义】

      例:0 2 * * * /u01/test.sh >/dev/null 2>&1 &

      这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null 文件,也就是清空。

      在这里有有几个数字的意思:

           0表示键盘输入

           1表示标准输出

           2表示错误输出.

     我们也可以这样写:

    0 2 * * * /u01/test.sh  >/u01/out.file &  --这里没写,默认是1

    0 2 * * * /u01/test.sh  1>/u01/out.file &

    0 2 * * * /u01/test.sh  2>/u01/out.file &

    0 2 * * * /u01/test.sh  2>/u01/out.file  2>&1 &

    将tesh.sh 命令输出重定向到out.file, 即输出内容不打印到屏幕上,而是输出到out.file文件中,2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件out.file。&1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。

    & :后台执行

     测试:

    ls 2>1 : 不会报没有2文件的错误,但会输出一个空的文件1;

    ls xxx 2>1: 没有xxx这个文件的错误输出到了1中;

    ls xxx 2>&1: 不会生成1这个文件了,不过错误跑到标准输出了;

    ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1;  因为重定向符号>默认是1,这句就把错误输出和标准输出都传到out.txt 文件中。

    2>&1写在后面的原因

           格式:command > file 2>&1   == command  1> file 2>&1

           首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

    如果改成: command 2>&1 >file

           2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

  • 相关阅读:
    poj 3616 Milking Time
    poj 3176 Cow Bowling
    poj 2229 Sumsets
    poj 2385 Apple Catching
    poj 3280 Cheapest Palindrome
    hdu 1530 Maximum Clique
    hdu 1102 Constructing Roads
    codeforces 592B The Monster and the Squirrel
    CDOJ 1221 Ancient Go
    hdu 1151 Air Raid(二分图最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/zyanrong/p/12540595.html
Copyright © 2011-2022 走看看