Linux連線斷掉時,防止執行的jar包程序死亡(nohup、&命令)
(一)先來了解一下nohup和&命令:
&
當在前臺執行某個作業時,終端被該作業佔據;可以在命令後面加上& 實現後臺執行。例如:sh test.sh &
適合在後臺執行的命令有f i n d、費時的排序及一些s h e l l指令碼。在後臺執行作業時要當心:需要使用者互動的命令不要放在後臺執行,因為這樣你的機器就會在那裡傻等。不過,作業在後臺執行一樣會將結果輸出到螢幕上,干擾你的工作。如果放在後臺執行的作業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個檔案中:
command > out.file 2>&1 &
這樣,所有的標準輸出和錯誤輸出都將被重定向到一個叫做out.file 的檔案中。
nohup
使用&命令後,作業被提交到後臺執行,當前控制檯沒有被佔用,但是一但把當前控制檯關掉(退出帳戶時),作業就會停止執行。nohup命令可以在你退出帳戶之後繼續執行相應的程序。nohup就是不掛起的意思( no hang up)。該命令的一般形式為:
nohup command &
(二)將程序設定成後臺執行
1、在使用 java -jar 命令執行jar包後,Linux伺服器終端連線斷掉,jar包的執行程序也會斷掉,這是我們不希望看到的結果。所以,為了防止程序中斷,可以使用nohup命令讓程序在後臺執行,即使終端連線斷開,也不會對其造成影響。
nohup命令會將桌面輸出改為輸出到“nohup.out”檔案(預設檔案,也可自定義指定輸出檔案)中,相當於是log的作用。
[[email protected] java]# nohup java -jar MelifeTest.jar &
2、Linux下還有一個特殊的檔案/dev/null,它就像一個無底洞,所有重定向到它的資訊都會消失得無影無蹤。這一點非常有用,當我們不需要回顯程式的所有資訊時,就可以將輸出重定向到/dev/null。
如果想要正常輸出和錯誤資訊都不顯示,則要把標準輸出和標準錯誤都重定向到/dev/null, 例如:
[
[email protected] ~]# nohup java -jar MelifeTest.jar >/dev/null 2>&1
3、將錯誤輸出到“黑洞”
[[email protected] java]# nohup java -jar MelifeTest.jar 2>/dev/null
4、>/dev/null 2>&1預設情況是1,也就是等同於1>/dev/null 2>&1。意思就是把標準輸出重定向到“黑洞”,還把錯誤輸出2重定向到標準輸出1,也就是標準輸出和錯誤輸出都進了“黑洞” 。
[[email protected] java]# nohup java -jar MelifeTest.jar >/dev/null 2>&1
5、將錯誤輸出2重定向到標準輸出1,也就是螢幕,標準輸出進了“黑洞”,也就是標準輸出進了黑洞,錯誤輸出列印到螢幕 。再設定成後臺執行。
[[email protected] java]# nohup java -jar MelifeTest.jar 2>&1 >/dev/null &
(三)相關快捷鍵
使用了nohup之後,很多人就這樣不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是自己結束了。所以在使用nohup命令後臺執行命令之後,需要使用exit正常退出當前賬戶,這樣才能保證命令一直在後臺執行。
ctrl + z
可以將一個正在前臺執行的命令放到後臺,並且處於暫停狀態。
Ctrl+c
終止前臺命令。
jobs
檢視當前有多少在後臺執行的命令。
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的程序標識。
參考博文: