一、前言
我們通過shell窗口運行程序時,由於有的程序長時間運行,直到下班了都還沒有返回運行結果。這個時候,我們又不能直接關閉shell窗口,不然前面的時間就白白運行了。
那有什么辦法可以先暫停程序,明天再繼續運行呢?(不可行,關閉shell窗口后,后台暫停的程序就終止了)
有!
二、分析方案
方案一:后台運行(有效方案,強烈推薦)。使用 nohup 或者 at
方案二:背景環境運行(無效方案)。使用ctrl+z、bg等
三、方案對比:
方式一:后台運行。使用 nohup 或者 at
特點是可以關閉shell窗口,但是沒有暫停功能,適用於明天查看類型。用pstree或者ps -ef | grep xxx查看,kill 來殺死。
方式二:背景環境運行。使用ctrl+z、bg等
特點是不可以關閉shell窗口,具有暫停功能,適用於短暫的放入背景工作。用jobs -l 查看,關閉shell窗口或者kill來殺死。
ctrl+Z 將現在前景的、運行的程序,變成背景的、暫停的工作。
jobs 查看背景中的工作編號。 jobs -l可以查看工作進程編號。
fg %1 調回前景環境運行。將方括號編號為[1]的背景的、暫停的程序,變成前景的、運行的程序。
bg %2 將背景環境中暫停的工作運行起來。將方括號編號為[2]的背景的、暫停的程序,變成背景的、運行的程序。
ping 127.0.0.1 > ping.log & 將現在xxx命令程序,變成背景的、運行的程序。在背景當中執行的指令,如果有 stdout 及 stderr 時,他的數據依舊是輸出到屏幕上面的, 所以,最佳的狀況就是利用數據流重導向, 將輸出數據傳送至某個文件中。
注意:
1、后台運行和背景運行不一樣。在背景中的、運行的程序不能被ctrl+C 終止掉,但是可以關閉shell終端或者kill來終止掉。后台運行的程序,關閉shell也不能終止掉,需用kill來終止掉。
2、背景環境中的程序依賴當前shell窗口存活。背景環境中的進程叫工作。一個shell中的背景環境中的工作,可以用jobs查看,當前shell窗口關閉了背景中的工作也就關閉了。所以在其他shell窗口中,jobs查不到背景環境中的工作。
3、查看背景環境中的工作用jobs,查看后台環境中的進程用pstree。
4、開啟背景環境中的工作用①先書寫命令,再輸出重定向和& 或者②先執行命令,再ctrl+Z和bg %1
附圖說明:
延伸:linux后台運行。在命令最后加&符,就可以實現后台運行。
xxx >/dev/null 2>&1 &
如:
python findfile_email.py >/dev/null 2>&1 &
這樣程序就會在后台運行,且沒有日志輸出。