日期:2014-05-16 浏览次数:20755 次
while [ $? = 1 ]; do repo sync -c done
上面给出来的是这个脚本最重要的部分,即一旦命令执行出错,shell命令返回值是1代表出错,则继续执行原来的命令。到这里我们可以解决了命令本身出错,接下来要解决的也是很常见的:网络连接断开的情况。
一个实验室或者一个团队共享一台比较不错的linux服务器,大家用putty等工具连接服务器,在各自的账户下工作。如果不采取一些操作的话,如果putty的连接断开了,任务也会终止执行。首先我们要掌握一些基本东西:当用户注销或者网络断开时,控制进程会收到HUP信号退出,并且该信号会发到前台进程组,最终导致关闭所有进程。貌似有点复杂,简化下:putty断开以后,控制进程收到HUP信号退出,并且HUP信号也会使得其它进程退出。
第一种方法:nohup
nohup顾名思义,用途就是让提交的命令忽略hangup信号。如果直接在putty处使用nohup的话,在误操作直接关闭putty连接的话还是会导致任务中断执行。所以一般使用nohup都是和&这个命令一起执行的,即将任务放在后台进程中执行,并且忽略掉中断信号。这种方式下网络连接断掉或者putty被关闭,任务都会一直进行下去。下面是nohup使用格式:
nohup <command> [argument…] &
第二种方法:setsid
setsid是参考守护进程的思想,将这个任务放在一个完全新的进程中执行,让这个进程不属于接受HUP信号的进程的子进程,这样断开就不会影响到任务的执行。setsid的用法比较简单,如下:
setsid <command> [argument…]
执行完这个命令之后,使用pstree命令可以看到,任务进程在一个新的进程树中,这样挂断信号就不会影响到任务的执行了。另外防止任务中断还可以用一个非常强大的应用screen,不过这个太强大了用处非常多,用来防止任务中断只是非常小的一个部分。这里就提下,不做详细说明。