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

本文详细介绍了Cron作为系统主要进程调度的工作原理及配置方法,并提供了如何使用Crontab命令来设置和管理定时任务的具体步骤。同时,还提供了一个实际的例子,展示了如何通过编写脚本来自动化管理和更新Crontab配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://my.oschina.net/u/177429/blog/31831

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值