linux 技巧一:让任务一直执行
在工作中,经常会遇到耗时命令,比如repo sync一个android全工程代码。这些个命令执行非常耗时,总不能一直盯着这些命令执行。这时候我们就需要做些什么来保证这些任务会不间断的执行到完成。个人现在感觉让工程代码安全可靠执行的已经是工作内容的一个重要部分,并且越来越重要。
首先,如果是命令本身执行遇到错误,需要重新输入命令才能继续执行的话,我们可以写一个脚本来帮助我们完成。还是刚才的例子,repo sync代码出错了怎么办?大可以放弃直接使用repo命令,写一个如下的shell脚本:
while [ $? = 1 ]; dorepo sync -cdone
上面给出来的是这个脚本最重要的部分,即一旦命令执行出错,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,不过这个太强大了用处非常多,用来防止任务中断只是非常小的一个部分。这里就提下,不做详细说明。