閱讀目錄
- nohup和&背景運作,程序檢視及終止
- 1.nohup
- 2.&
- 3.nohup和&的差別
- &:是指在背景運作,當使用者退出(挂起)的時候,指令自動跟着結束
- nohup:不挂斷的運作,注意并沒有背景運作的功能,就是指用nohup運作指令可以使指令永久的執行下去,和使用者終端沒有關系,例如我們斷開SSH連接配接都不會影響他的運作,注意了nohup沒有背景運作的意思;&才是背景運作是以将nohup和&結合使用,就可以實作使指令永久地在背景執行的功能
- 4.舉例
- 1 sh test.sh &
- 2 nohup sh test.sh
- 3 nohup sh test.sh &
- 輸出重定向
正文
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 | |

程序号7585
檢視運作的背景程序
(1)jobs -l
jobs指令隻看目前終端生效的,關閉終端後,在另一個終端jobs已經無法看到背景跑得程式了,此時利用ps(程序檢視指令)
(2)ps -ef
|
a:顯示所有程式
u:以使用者為主的格式來顯示
x:顯示所有程式,不以終端機來區分
注:
用ps -def | grep查找程序很友善,最後一行總是會grep自己
用grep -v參數可以将grep指令排除掉
|
再用awk提取一下程序ID
|
3.如果某個程序起不來,可能是某個端口被占用
檢視使用某端口的程序
|
|
檢視到程序id之後,使用netstat指令檢視其占用的端口
|
使用kill殺掉進城後再啟動
4.終止背景運作的程序
|