如何让命令继续运行,当关闭console后

昨天下班的时候听同事抱怨用ssh登录远端linux,运行一个命令,没想到花费时间超出预期,到下班还没结束,又不能关掉console,否则命令就terminate了。

想了想这方面的知识,nohup, &等等,查了下以备后用。

首先,当关掉console或者因网络故障console断开,远端linux就会收到一个HUP(hangup)信号,然后linux就会关闭之前连接(tty)以及它的所有子进程,这个导致了命令的终止。

知道了原因就有两种解决方法:

  • 让命令不受到hup信号的干扰
  • 让命令进程不再是连接(tty)的子进程

nohup

在命令前加nohup,例如: 

nohup ping 9.111.250.139 

这样当console被关闭时命令不会终止。

setid

在命令前加setid, 例如:

setid ping 9.111.250.139

这样这个ping命令的父进程变成了起始进程#1,所以当console被关闭时,它任然没事。

&

将命令放入()并在末尾加&, 例如:

(ping 9.111.250.139 &)

这样做,ping的父进程也是#1,所以也能逃过一劫

但是,如果命令在运行时候并没有加上上述技巧还有救吗? 有救!

disown

首先,如果运行在前台(没有在末尾加&),那么使用ctrl + z使命令暂停,然后用jobs查看命令号(jobspec)。

然后使用bg jobspec让命令恢复运行在后台,最后用disown -h jobspec 把改命令设置为忽略hup信号就成了。

解释一点:为啥要用ctrl+z来暂停命令呢,因为我们要得到命令号(jobspec),但是jobs这个命令只能列出当前进程的子进程,所以只能在当前 console下运行jobs。

另外:jobspec在output中是个数字,但是使用的时候再数字之前要加%

当然如果在命令运行在后台(末尾加&),那就简单了,直接用jobs查出jobspec,然后用disown就可以了。

猜你喜欢

转载自blog.csdn.net/pushme_pli/article/details/85156924