1. 程式人生 > 實用技巧 >Linux後臺執行命令:&和nohup nohup和&後臺執行,程序檢視及終止

Linux後臺執行命令:&和nohup nohup和&後臺執行,程序檢視及終止

nohup和&後臺執行,程序檢視及終止

閱讀目錄

正文

nohup和&後臺執行,程序檢視及終止

1.nohup

用途:不掛斷地執行命令。我們在使用Xshell等工具執行Linux指令碼時,有時候會由於網路問題,導致失去連線,終端斷開,程式執行一半就意外結束了。這種時候,就可以用nohup指令來執行指令,使程式可以忽略掛起訊號繼續執行。

語法:nohup Command [ Arg … ] [ & ]

  無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。

  如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。

  如果沒有檔案能建立或開啟以用於追加,那麼 Command 引數指定的命令不可呼叫。

退出狀態:該命令返回下列出口值:     126 可以查詢但不能呼叫 Command 引數指定的命令。     127 nohup 命令發生錯誤或不能查詢由 Command 引數指定的命令。     否則,nohup 命令的退出狀態是 Command 引數指定命令的退出狀態。

2.&

用途:在後臺執行

一般兩個一起用

nohup command &

3.nohup和&的區別

&:是指在後臺執行,當用戶退出(掛起)的時候,命令自動跟著結束


nohup:不掛斷的執行,注意並沒有後臺執行的功能,就是指用nohup執行命令可以使命令永久的執行下去,和使用者終端沒有關係,例如我們斷開SSH連線都不會影響他的執行,注意了nohup沒有後臺執行的意思;&才是後臺執行

因此將nohup和&結合使用,就可以實現使命令永久地在後臺執行的功能

4.舉例

1 sh test.sh &

將sh test.sh任務放到後臺 ,關閉xshell,對應的任務也跟著停止


2 nohup sh test.sh

將sh test.sh任務放到後臺,關閉標準輸入,終端不再能夠接收任何輸入(標準輸入),重定向標準輸出和標準錯誤到當前目錄下的nohup.out檔案,
即使關閉xshell退出當前session依然繼續執行


3 nohup sh test.sh &

將sh test.sh任務放到後臺,但是依然可以使用標準輸入,終端能夠接收任何輸入,重定向標準輸出和標準錯誤到當前目錄下的nohup.out檔案,
即使關閉xshell退出當前session依然繼續執行

輸出重定向

  

作業在後臺執行的時候,可以把輸出重定向到某個檔案中,相當於一個日誌檔案,記錄執行過程中的輸出。使用方法:nohup command > out.file 2>&1 &
command>out.file是將command的輸出重定向到out.file檔案,即輸出內容不列印到螢幕上,而是輸出到out.file檔案中。
在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
2>&1是將標準錯誤(2)重定向到標準輸出(&1),標準輸出(&1)再被重定向輸入到out.file檔案中。



舉個例子,我們需要保持 test.py 程式的持續執行(用於長時間訓練神經網路),並且將控制檯輸出重定向到日誌檔案中,那麼如下命令可以輕鬆辦到:

nohup python test.py > log.txt &

在使用 nohup 後臺執行命令之後,需要使用 exit 正常退出當前賬戶,這樣才能更好地保證命令一直在後臺執行。

上述程序保持持續執行一段時間後,若想停止執行,即殺掉該程序,有如下操作:

kill -9  程序id

eg:

1 nohup /usr/local/node/bin/node /www/im/chat.js >> /usr/local/node/output.log 2>&1 &

程序號7585

檢視執行的後臺程序

(1)jobs -l

jobs命令只看當前終端生效的,關閉終端後,在另一個終端jobs已經無法看到後臺跑得程式了,此時利用ps(程序檢視命令)

(2)ps -ef

1 ps -aux|grep chat.js
 a:顯示所有程式 
u:以使用者為主的格式來顯示
x:顯示所有程式,不以終端機來區分

注:

  用ps -def | grep查詢程序很方便,最後一行總是會grep自己

  用grep -v引數可以將grep命令排除掉

1 ps -aux|grep chat.js| grep -v grep

  再用awk提取一下程序ID 

1 ps -aux|grep chat.js| grep -v grep | awk'{print $2}'

3.如果某個程序起不來,可能是某個埠被佔用

檢視使用某埠的程序

1 lsof -i:8090

1 netstat -ap|grep 8090

檢視到程序id之後,使用netstat命令檢視其佔用的埠

1 netstat -nap|grep 7779

使用kill殺掉進城後再啟動

4.終止後臺執行的程序

1 kill -9 程序號

Linux後臺執行命令:&和nohup

風的低語 0.1012018.07.01 03:56:41字數 997閱讀 9,815

當我們在終端或控制檯工作時,可能不希望由於執行一個作業而佔住了螢幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對於密集訪問磁碟的程序,我們更希望它能夠在每天的非負荷高峰時間段執行(例如凌晨)。為了使這些程序能夠在後臺執行,也就是說不在終端螢幕上執行,有幾種選擇方法可供使用。

&
當在前臺執行某個作業時,終端被該作業佔據;可以在命令後面加上& 實現後臺執行。例如:sh test.sh &
適合在後臺執行的命令有f i n d、費時的排序及一些s h e l l指令碼。在後臺執行作業時要當心:需要使用者互動的命令不要放在後臺執行,因為這樣你的機器就會在那裡傻等。不過,作業在後臺執行一樣會將結果輸出到螢幕上,干擾你的工作。如果放在後臺執行的作業會產生大量的輸出,最好使用下面的方法把它的輸出重定向到某個檔案中:
command > out.file 2>&1 &
1
這樣,所有的標準輸出和錯誤輸出都將被重定向到一個叫做out.file 的檔案中。

PS:當你成功地提交程序以後,就會顯示出一個程序號,可以用它來監控該程序,或殺死它。(ps -ef | grep 程序號 或者 kill -9 程序號)

nohup
使用&命令後,作業被提交到後臺執行,當前控制檯沒有被佔用,但是一但把當前控制檯關掉(退出帳戶時),作業就會停止執行。nohup命令可以在你退出帳戶之後繼續執行相應的程序。nohup就是不掛起的意思( no hang up)。該命令的一般形式為:

nohup command &

如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的檔案中,除非另外指定了輸出檔案:

nohup command > myout.file 2>&1 &

使用了nohup之後,很多人就這樣不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是自己結束了。所以在使用nohup命令後臺執行命令之後,需要使用exit正常退出當前賬戶,這樣才能保證命令一直在後臺執行。

ctrl + z 

可以將一個正在前臺執行的命令放到後臺,並且處於暫停狀態。

Ctrl+c 

終止前臺命令。

jobs 

檢視當前有多少在後臺執行的命令。
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的程序標識。

2>&1解析

command >out.file 2>&1 &

command>out.file是將command的輸出重定向到out.file檔案,即輸出內容不列印到螢幕上,而是輸出到out.file檔案中。
2>&1 是將標準出錯重定向到標準輸出,這裡的標準輸出已經重定向到了out.file檔案,即將標準出錯也輸出到out.file檔案中。最後一個&, 是讓該命令在後臺執行。
試想2>1代表什麼,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個檔案1,而不代表標準輸出;換成2>&1,&與1結合就代表標準輸出了,就變成錯誤重定向到標準輸出.