网站解析是什么意思,网站优化软件排行榜,万维网站建设,湖南企业网站建设From: http://www.centoscn.com/CentOS/help/2014/1030/4025.html 前言 crontab是Unix和Linux用于设置周期性被执行的指令#xff0c;是互联网很常用的技术#xff0c;很多任务都会设置在crontab循环执行#xff0c;如果不使用crontab#xff0c;那么任务就是常驻程序是互联网很常用的技术很多任务都会设置在crontab循环执行如果不使用crontab那么任务就是常驻程序这对你的程序要求比较高一个要求你的程序是24X7小时不宕机一个是 要求你的调度程序比较可靠实际工作中90%的程序都没有必要花这么多时间和精力去解决上面的两个问题的只需要写好自己的业务逻辑通过crond这 个工业级程序去调度就行了crond的可靠性健壮性大家应该是毫无疑问的。 crontab简易入门 假设我要设置一个任务每分钟就要做一个数据同步这个同步脚本的路径是/home/blue/do/rsyncfile.sh那么我可以在这么配置使用blue用户在终端输入 1 crontab -e 2 # 此时会进入 vi 的编辑画面让您编辑工作注意到每项工作都是一行。 3 #分 时 日 月 周 |任务的完整命令行 4 * * * * * /home/blue/do/rsyncfile.sh 默认情况下任何使用者只要不被列入 /etc/cron.deny 当中那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了整个过程就如同上面提到的会进入 vi 的编辑画面 然后以一个工作一行来编辑编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了 假如我们需要修改为每5分钟运行数据同步的脚本那么同样使用 crontab -e 进入编辑 1 */5 * * * * /home/blue/do/rsyncfile.sh 假如服务器出了问题有一天的数据没有同步于是我们就需要补数据了假设这个补数据的脚本是/home/blue/do /rsyncfile_day.sh,但是白天是高峰期晚上用户不多是低峰期我们补数据会占用大量带宽尤其是白天会影响正常业务所以一般我们 可以让补数据任务在凌晨2点开始跑那么同样使用crontab -e 进入编辑 1 0 2 1 4 * /home/blue/do/rsyncfile_day.sh 这样在4月1号凌晨2点0分就会开始启动我们的补数据的脚本了。 同步数据在互联网公司是再平常不过的任务了这里大家可以看到crontab的魅力所在了只需要写最简单的业务逻辑把调度交给crond做就完成了一个可靠性很高的一项任务了如果要自己去额外写这种调度程序不知道要花多少精力才能做到可靠稳定。 crontab的语法 1 crontab [-u username] [-l|-e|-r] 2 选项与参数 3 -u 只有 root 才能进行这个任务亦即帮其他使用者创建/移除 crontab 工作排程 4 -e 编辑 crontab 的工作内容 5 -l 查阅 crontab 的工作内容 6 -r 移除所有的 crontab 的工作内容若仅要移除一项请用 -e 去编辑 查询使用者目前的 crontab 内容: 1 crontab -l 2 */5 * * * * /home/blue/do/rsyncfile.sh 3 0 2 1 4 * /home/blue/do/rsyncfile_day.sh 清空使用者目前的 crontab: 1 crontab -r 2 crontab -l 3 no crontab for blue 如果你想删除当前用户的某一个crontab任务那么使用crontab -e进入编辑器再删除对应的任务。 crontab的限制 /etc/cron.allow将可以使用 crontab 的帐号写入其中若不在这个文件内的使用者则不可使用 crontab /etc/cron.deny将不可以使用 crontab 的帐号写入其中若未记录到这个文件当中的使用者就可以使用 crontab 。 以优先顺序来说 /etc/cron.allow 比 /etc/cron.deny 要优先 而判断上面这两个文件只选择一个来限制而已因此建议你只要保留一个即可 免得影响自己在配置上面的判断一般来说系统默认是保留 /etc/cron.deny 你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny 当中一个帐号一行 /etc/crontab配置文件讲解 『 crontab -e 』是针对使用者的 cron 来设计的如果是『系统的例行性任务』时就要编辑 /etc/crontab 这个文件。 那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个运行档但是 /etc/crontab 可是一个『纯文字档』,必须用 root 的身份编辑一下这个文件。 首先我们要来看看crontab的文件内容 01 cat /etc/crontab 02 03 # /etc/crontab: system-wide crontab 04 # Unlike any other crontab you dont have to run the crontab 05 # command to install the new version when you edit this file 06 # and files in /etc/cron.d. These files also have username fields, 07 # that none of the other crontabs do. 08 09 SHELL/bin/sh 10 PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 11 12 # m h dom mon dow user command 13 17 * * * * root cd / run-parts --report /etc/cron.hourly 14 25 6 * * * root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.daily ) 15 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.weekly ) 16 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / run-parts --report /etc/cron.monthly ) 这个文件与将刚刚我们下达 crontab -e 的内容几乎完全一模一样只是有几个地方不太相同 1 PATH.... 这里就是输入运行档的搜寻路径使用默认的路径配置就已经很足够了 1 17 * * * * root cd / run-parts --report /etc/cron.hourly 这个 /etc/crontab 里面预配置义出四项工作任务分别是每小时、每天、每周及每个月分别进行一次的工作 但是在五个栏位后面接的并不是命令而是一个新的栏位那就是『运行后面那串命令的身份』为何这与使用者的 crontab -e 不相同。由於使用者自己的 crontab 并不需要指定身份但 /etc/crontab 里面当然要指定身份啦以上表的内容来说系统默认的例行性工作是以 root 的身份来进行的。 那么后面那串命令是什么呢你可以使用『 which run-parts 』搜寻看看其实那是一个 bash script 啦如果你直接进入 /usr/bin/run-parts 去看看 会发现这支命令会将后面接的『目录』内的所有文件捉出来运行这也就是说『 如果你想让系统每小时主动帮你运行某个命令将该命令写成 script并将该文件放置到 /etc/cron.hourly/ 目录下即可』的意思 现在你知道系统是如何进行他默认的一堆例行性工作排程了吗如果你下达『 ll /etc/cron.daily 』就可以看到一堆文件 那些文件就是系统提供的 script 而这堆 scripts 将会在每天的凌晨 6:25 开始运行 假设你现在要作一个目录让系统可以每 2 分钟去运行这个目录下的所有可以运行的文件你可以写下如下的这一行在 /etc/crontab 中 1 */2 * * * * root run-parts /etc/cron.min 当然罗 /etc/cron.min 这个目录是需要存在的喔那如果我需要运行的是一个『程序』而已 不需要用到一个目录呢该如何是好例如在侦测网络流量时我们希望每五分钟侦测分析一次 可以这样写 1 */5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg 如何创建例行性命令很简单吧如果你是系统管理员而且你的工作又是系统维护方面的例行任务时 直接修改 /etc/crontab 这个文件即可喔又便利又方便管理呢 crontab的原理 当使用者使用 crontab 这个命令来创建工作排程之后该项工作就会被纪录到 /var/spool/cron/ 里面去了而且是以帐号来作为判别的喔举例来说 blue 使用 crontab 后 他的工作会被纪录到 /var/spool/cron/blue 里头去但请注意不要使用 vi 直接编辑该文件 因为可能由于输入语法错误会导致无法运行 cron 喔另外 cron 运行的每一项工作都会被纪录到 /var/log/cron 这个登录档中所以罗如果你的 Linux 不知道有否被植入木马时也可以搜寻一下 /var/log/cron 这个登录档呢 crond服务的最低侦测限制是『分钟』所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』因此只要你编辑完 /etc/crontab 这个文件并且将他储存之后那么 cron 的配置就自动的会来运行了 备注在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项但是某些原因或者是其他的 Unix 系统中由于 crontab 是读到内存当中的所以在你修改完 /etc/crontab 之后可能并不会马上运行 这个时候请重新启动 crond 这个服务吧『/etc/init.d/crond restart』 或 『service crond restart』 crontab的格式讲解 每项工作 (每行) 的格式都是具有六个栏位这六个栏位的意义为
代表意义分钟小时日期天月份周命令数字范围0-590-231-311-120-7呀就命令啊 比较有趣的是那个『周』喔周的数字为 0 或 7 时都代表『星期天』的意思另外 还有一些辅助的字符大概有底下这些
特殊字符代表意义*(星号)代表任何时刻都接受的意思举例来说范例一内那个日、月、周都是 * 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思,(逗号) 代表分隔时段的意思。举例来说如果要下达的工作是 3:00 与 6:00 时就会是 0 3,6 * * * command 时间参数还是有五栏不过第二栏是 3,6 代表 3 与 6 都适用 -(减号) 代表一段时间范围内举例来说 8 点到 12 点之间的每小时的 20 分都进行一项工作 20 8-12 * * * command 仔细看到第二栏变成 8-12 喔代表 8,9,10,11,12 都适用的意思 /n(斜线) 那个 n 代表数字亦即是『每隔 n 单位间隔』的意思例如每五分钟进行一次则 */5 * * * * command 很简单吧用 * 与 /5 来搭配也可以写成 0-59/5 相同意思 周与日月不可同时并存 另一个需要注意的地方在於『你可以分别以周或者是日月为单位作为循环但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说你不可以这样编写一个工作排程 1 30 12 11 9 5 root echo just test 这是错误的写法 本来你以为九月十一号且为星期五才会进行这项工作无奈的是系统可能会判定每个星期五作一次或每年的 9 月 11 号分别进行如此一来与你当初的规划就不一样了所以罗得要注意这个地方上述的写法是不对的 CentOS下查看crontab执行历史记录 在crontab中添加了定时任务但发现没有得到期望的结果因而怀疑是crontab没有执行相应的任务但怎么定位crontab是否执行呢 这就需要查看crontab的执行历史记录具体位置如下 1 cd /var/log 2 tail -100 cron 在cron文件中即可查阅已经操作过的相关定时任务。 参考资料: http://vbird.dic.ksu.edu.tw/linux_basic/0430cron_3.php http://baike.baidu.com/view/1229061.htm 一、Crontab 格式说明 我们可以用 crontab -e 添加要执行的命令。 命令执行的结果无论是标准输出还是错误输出都将以邮件形式发给用户。 添加的命令必须以如下格式 * * * * * /command path 前五个字段可以取整数值指定何时开始工作第六个域是字符串即命令字段其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。 前5个字段分别表示 分钟0-59 小时1-23 日期1-31 月份1-12 星期0-60表示周日 还可以用一些特殊符号 * 表示任何时刻 , 表示分割 表示一个段如第二端里 1-5就表示1到5点 /n : 表示每个n的单位执行一次如第二段里*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1. 一些示例 00 8,12,16 * * * /data/app/scripts/monitor/df.sh 30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh 10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh 10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh 10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh 43 21 * * * 21:43 执行 15 05 * * * 05:15 执行 0 17 * * * 17:00 执行 0 17 * * 1 每周一的 17:00 执行 0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行 0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行 0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行 42 4 1 * * 毎月1日的 4:42分 执行 0 21 * * 1-6 周一到周六 21:00 执行 0,10,20,30,40,50 * * * * 每隔10分 执行 */10 * * * * 每隔10分 执行 * 1 * * * 从1:0到1:59 每隔1分钟 执行 0 1 * * * 1:00 执行 0 */1 * * * 毎时0分 每隔1小时 执行 0 * * * * 毎时0分 每隔1小时 执行 2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行 30 5 1,15 * * 1日 和 15日的 5:30 执行 二、 后台执行命令 当在前台运行某个作业时终端被该作业占据而在后台运行作业时它不会占据终端。可以使用命令把作业放到后台执行。 如 1 30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh 在后台运行作业时要当心需要用户交互的命令不要放在后台执行因为这样你的机器就会在那里傻等。 不过作业在后台运行一样会将结果输出到屏幕上干扰你的工作。如果放在后台运行的作业会产生大量的输出最好使用下面的方法把它的输出重定向到某个文件中 如 1 command out.file 21 在这个例子中21表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 三、21 含义 先看一个例子 1 0 2 * * * /u01/test.sh /dev/null 21 这句话的意思就是在后台执行这条命令并将错误输出2重定向到标准输出1然后将标准输出1全部放到/dev/null 文件也就是清空。 在这里有有几个数字的意思 0表示 键盘输入 1表示 标准输出 2表示 错误输出 我们也可以这样写 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 21 将tesh.sh 命令输出重定向到out.file, 即输出内容不打印到屏幕上而是输出到out.file文件中。 21 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件out.file。 1 表示的是文件描述1表示标准输出如果这里少了就成了数字1就表示重定向到文件1。 后台执行 测试 ls 21 不会报没有2文件的错误但会输出一个空的文件1 ls xxx 21 没有xxx这个文件的错误输出到了1中 ls xxx 21 不会生成1这个文件了不过错误跑到标准输出了 ls xxx out.txt 21 ls xxx 1out.txt 21 因为重定向符号默认是1这句就把错误输出和标准输出都传到out.txt 文件中。 四、21写在后面的原因 格式command file 21 command 1 file 21 首先是command file将标准输出重定向到file中 21 是标准错误拷贝了标准输出也就是同样被重定向到file中最终结果就是标准输出和错误都被重定向到file中。 如果改成 command 21 file 21 标准错误拷贝了标准输出的行为但此时标准输出还是在终端。file 后输出才被重定向到file但标准错误仍然保持在终端。 延伸阅读 Shell标准输出、标准错误 /dev/null 21 如何让Linux定时任务crond以秒为单位执行(如每隔3秒) 经验教训 打算在服务器上 每天晚上23:00 定时执行Python脚本去备份MySql数据库命令如下 1 * 23 * * * python /var/www/html/crontab_python/back_db.py /dev/null 21 结果呢每次备份都产生了 60份 备份文件仔细查看定时任务命令发现在“分”的位置上少加了个“0”因为“*”表示该位置的任何一个值修改如下 1 0 23 * * * python /var/www/html/crontab_python/back_db.py /dev/null 21 0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.8.26 /dev/null 21 0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.10.151 /dev/null 21