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脚本,就会运行该脚本.
无比感谢武同学的指导.
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的源。有时候因为网络问题,导致中断,所以需要重新运行。
怎么做到断点续传的?