1. 程式人生 > >如何讓命令繼續執行,當關閉console後

如何讓命令繼續執行,當關閉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就可以了。