Nov 272013
 

我以前一直使用一个脚本下载Ubuntu的源,Ubuntu 12.04的源,全部大概是120G,我1M带宽,要下载完,真的要10天时间。脚本运行过程中经常因为网络各种原因,中途退出和中断。

Ubuntu 源下载脚本http://www.chenshake.com/centos6-x-production-of-ubuntu12-04-source/

如果能让脚本退出后,自动继续运行呢?这是困惑我很久的问题,今天请教同事,终于搞定。

原理就是设置Crontab,检查一下脚本是否在运行,如果没有运行,就运行该脚本。如果在运行,就不进行任何操作。

我的ubuntu 下载脚本名字为:ubuntu_mirror.sh

编辑该脚本

在开始部分,增加下面内容

#!/bin/sh

appname=`basename $0`
nowdate=`date +%Y%m%d%H%M%S`
echo $$ > ${nowdate}.${appname}.pid

在脚本末尾,有两个退出 : exit 1 和  exit 0

就是在exit 1 和exit 0 上面添加一行

 rm ${nowdate}.${appname}.pid

修改后的脚本如下 http://paste2.org/e08zCJWF

 

创建一个master.sh 脚本

appname=$1

if [ -e *.${appname}.pid ]; then
        exit 0
else
        echo "running"
        nohup sh -x ./${appname} 1>${appname}.out 2>&1 &
fi

让脚本可运行

chmod +x master.sh

 

最后你需要设置crontab

运行命令

crontab -e

插入下面内容,表示10分钟运行一次.

0,10,20,30,40,50 * * * * /root/master.sh ubuntu_mirror.sh

这个时候,在脚本的目录里,可以看到一个类似 20131127223001.ubuntu_mirror.sh.pid 文件,就是脚本运行的进程id.

# cat 20131127223001.ubuntu_mirror.sh.pid 
12549

脚本退出后,会删除这个文件.如果crontab检查到这个文件存在,就不会运行脚本,认为脚本正在运行.如果不存在pid脚本,就会运行该脚本.

无比感谢武同学的指导.

  3 Responses to “Shell脚本中断后进行运行”

  1. hi,

    有缘看到,但是有点儿疑虑,望解答

    1:如果脚本成功退出也会删除pid那个文件,那么你在检查的时候判断那个pid文件存在不,如果不存在就会继续支持ubuntu_mirror.sh脚本,这样的话,下载成功了也会再执行ubuntu_mirror.sh程序。

    2:为什么crontab 要每隔两分钟同时运行两个程序0,10,20,30,40,50 * * * * /root/master.sh ubuntu_mirror.sh 这样岂不是每隔10分钟就运行了ubuntu_mirror.sh脚本,只是脚本退出/root/master.sh 不调用那个脚本而已

    Regards,
    Bruce

    • 你的理解正确,设置crontab,是因为我带宽不足,需要长时间同步ubuntu的源。有时候因为网络问题,导致中断,所以需要重新运行。

  2. 怎么做到断点续传的?

 Leave a Reply

(required)

(required)