您的位置:首页 > 其它

UNIX下的定时任务-----cron

2011-09-04 00:00 225 查看
cron是系统的主要进程调度进程(每隔一分钟被激活检查,其余时间休眠),通过读取crontab文件中的内容来定时执行任务

其中在unix下可以每一个用户拥有一个crontab文件

但为了管理员的方便,一般就一个。每一个用户是否有权限拥有crontab文件可以通过如下文件进行设置

cron.deny和cron.allow

cron中有一个crontab命令来对crontab文件进行相关操作:
-l 查看crontab文件内容
-u 用户名 指定哪个用户的crontab文件
-e 编辑crontab文件
-r 删除crontab文件
crontab filename提交作业文件
1:创建crontab文件
(1)首先确定一个编辑器,对crontab文件进行编辑,一般是vi
设置如下:在$HOME下的.profile中增加如下:
EDITOR=vi;exportEDITOR
(2)创建一个文件,如test文件(一般是用户名,不是用户名也可以)
如创建的文件内容如下:
cat $HOME/test
0,30 * * * * /bin/echo"test">/dev/console
(3)crontab test
提交的文件会在/var/spool/cron/目录下一个文件中(这个文件名记为用户,那个用户的crontab记为那个用户)

2:一般情况下,最好不要直接操作/var/spool/cron/目录下的crontab文件,这样可能会因为操作问题,造成
更改crontab文件,而影响原来设置的cron任务
那么怎么办呢,一般我们通过编辑副本来编辑crontab文件
操作如下:
(1)crontab -l >filename
(2)通过编辑filename文件,增加或删除定时任务
(3)提交filename文件(这样发现/var/spool/cron/目录下一个文件已经改变成提交的那个啦,所以切勿更改错误哦)
(4)删除filename文件(或保留这个文件,以便你恢复使用。)
以下是我在使用crontab的一个例子,供大家参考:
crontab -l
# EDITE DO XXXXX
# (/home/test/daemon_crontab_1234 instatll on xxxx)
# version xxxxx
0,30 * * * * /home/test/project/bin/test --start >dev/null 2>&1
由于每次执行crontab filename均会在上述文件中(linux系统下,其他不会)增加上述类似的三行注释来表明我修改的时间,版本信息等
故,我如下的程序做了,对于指定的任务,只有这么三行表明我修改的时间和版本信息。故做了如下处理.
以下程序是曾经写过的脚本,现在重新写了下,但未调试,如果有错,稍稍调整以下就没有多大问题了。

#!/bin/ksh

main()
{
username=$1
type=$2
project=$3 #$3项目的home目录
crontab_bak=/home/test/daemon_crontab_$$
crontab_cp=/home/test/daemon_crontab_cp_$$
crontab -l >crontab_bak
project_temp=$(echo $project|sed 's/\//\\\//g')

#awk -v project_temp=project { gsub(/\//,"\\\/",project_temp) print project_temp}
awk 'BEGIN{
status=0
buff=""
}
index($0,"'$project'/project/bin/test --start") ==0 {
if( status == -1 ){
printf("%s",$0);
}
else if( status == 0 ){
if( $0 ~ /^# EDITE DO XXXXX/ )
{
status =1;
buff=sprintf("%s\n",$0);
}
else
{
status =-1;
buff=sprintf("%s\n",$0);

}
}
else if( status == 1 ){
if( $0 ~ /^# \('$project_temp'\/daemon_crontab_1234 instatll on xxxx\)/ ){
status =2;
buff=sprintf("%s%s\n",buff,$0)
}
else
{
status =-1;
printf("%s%s\n",buff,$0);
}
}else if( status == 2 ){
if( $0 ~ /^# version xxxxx/ ){
status =0;
buff="";
}
else
{
status =-1;
printf("%s\n",$0);
}
}

}' $crontab_bak > $crontab_cp

}
if [ "x$type" = "xadd" ]; then
{
echo "0,30 * * * * /home/test/project/bin/test --start >/dev/null 2>&1" >>$crontab_cp
crontab $crontab_cp
}

if [ "x$type" = "xdelete" ]; then
{
crontab $crontab_cp
}

rm -fr $crontab_cp
rm -fr $crontab_bak

main $@ 2>/dev/null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: