Linux crontab

    在使用linux系统开发时,不免要使用系统中的一些功能。比如程序的定时运行,系统定时做某些事情。而我在做java开发中,常使用系统中crontab类定时运行程序,虽然java中也有相关的实现,但是我个人认为还是系统的好用,因为在日志方面,程序管理方面更好。

在命令行中输入 crontab -e  就可以配置 cron 了。


下面是个简单的计划任务:

10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

 

这个例子中,命令本身又有三个部分:
1.”/usr/bin/php”。PHP脚本通常不会自己执行,它需要通过PHP解析器来执行。
2.”/www/virtual/username/cron.php”。这个是需要执行的脚本的路径。
3.”> /dev/null 2>&1″。这部分是处理脚本的输出的。稍后我们详细说它。

 

语法

cron 配置计划任务的书写格式:
* * * * *                 [用户名] 命令
分钟 小时 日 月 周 [用户名] 命令

 

第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。

对比上面的例子就知道,30是不是分钟??8是不是小时?如果有*代表的地方,表示全部,也就是说,每个月,每天,每星期都要执行。root 表示用root用户执行,命令是/sbin/reboot ,也就是说,系统在每天 8点30分重新启动;

 

示例:
下面的计划任务会一直运行

* * * * * [command]

下面的计划任务会在每个小时的0分时运行(就是每小时执行一次)

0 * * * * [command]

下面依旧是一个每小时运行一次的计划任务。不过是在每个小时的一刻钟时运行的(1:15,2:15.。。)

15 * * * * [command]

下面的计划任务每天执行一次,在2:30分

30 2 * * * [command]

下面的计划任务是在每个月2号的午夜执行(比如:2010年2月2日00:00)

0 0 2 * * [command]

下面的计划任务会在每周一的每个小时0分钟时执行一次

0 * * * 1 [command]

下面的会每小时运行3次,在0分,10分,和20分时

0,10,20 * * * * [command]

下面是用除号“/”表示每多少运行一次。本例是每5分钟运行一次

*/5 * * * * [command]

还可以用“-”表示一个范围,如下表示5到10点的每个整点运行一次

0 5-10 * * * [command]

另外还有一个特殊的时间关键字“@reboot”,就是每次重启服务器时运行计划任务

@reboot [command]
 
处理输出
如果你在命令行尾添加”> /dev/null 2>&1″,输出将会丢弃。(其他命令后面接它也会丢弃输出)。
$ /usr/local/bin/php hello.php
Hello world
$ /usr/local/bin/php hello.php > /dev/null 2>&1
$

大于号(>)用于重定向输出。”/dev/null”是个空设备,输出到那里就会忽略掉。
“2>&1″是标准错误输出,定向到标准输出。也是到”/dev/null”.

 

防止定时任务撞车

比如,你有一个每分钟都运行的计划任务,但是这个任务这分钟没有运行完成,下一分钟的计划任务也已经开始了。。这样也许会崩溃我们的服务器的。
我们可以通过文件锁来解决:

 

 
$fp = fopen('/tmp/lock.txt', 'r+');  
if(!flock($fp, LOCK_EX | LOCK_NB)) {  
    echo 'Unable to obtain lock';  
    exit(-1);  
}  
/* ... */  
fclose($fp);
 

过程:打开文件,判断文件是否锁定,锁定了就退出。这样第一个计划任务没运行结束时,文件不会关闭,也就没有解锁。
下一个时间触发的计划任务,也尝试打开文件,发现已被锁定,于是退出。这样就不会撞车了。


这里有c r o n t a b文件条目的一些例子:
30 21 * * * /apps/bin/cleanup.sh
上面的例子表示每晚的21:3 0运行/a p p s/b i n目录下的cleanup.sh。


45 4 1,10,22 * * /apps/bin/backup.sh
上面的例子表示每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h。


10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;
上面的例子表示每周六、周日的1 : 1 0运行一个f i n d命令。


0,30 18-23 * * * /apps/bin/dbcheck.sh
上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . s h。


0 23 * * 6 /apps/bin/qtrend.sh
上面的例子表示每星期六的11 : 0 0 p m运行/ a p p s / b i n目录下的q t r e n d . s h。

 

* */8 * * * sh /duitang/dist/cmd/restart_gu.sh 

每隔8小时重启一次gunicorn

 

参考:http://www.tsingfeng.com/?tag=cronjob

你可能感兴趣的:(crontab)