linux將程序放到后台執行
測試腳本test.sh:
1 i=1 2 while : 3 do 4 echo $i 5 sleep 1 6 ((i++))
一、當在前台運行某個作業時,終端會被該作業占據,從而需要再開一個終端來進行其他的操作,為了避免這種不方便我們可以將作業放到后台執行,主要有兩種方式
1、&命令
sh test.sh &
該命令將腳本放到后台執行,但是標准輸出還是會顯示到當前終端,影響用戶操作,所以最好是將輸出重定向到其他文件
sh test.sh &>/dev/null
如果需要查看輸出結果,也可以定向到一個固定的文件中。
2、通過ctrl+z;bg等一系列的命令,將已經在前台運行的作業放到后台執行
如果一個作業已經在前台執行,可以通過ctrl+z將該作業放到后台並掛起。然后通過jobs命令查看在后台執行的作業並找到對應的作業ID,執行bg %n(n為通過jobs查到的作業ID)喚醒該作業繼續執行。
該方式也存在結果會輸出到終端上的情況,同樣可以用重定向的方法解決
相關命令:
jobs------------查看在后台執行的進程
fg %n----------將后台執行進程n調到前台執行,n表示jobnumber(通過jobs查看的進程編號,而非pid)
ctrl+z----------將在前台執行的進程,放到后台並掛起
bg %n---------將在后台掛起的進程,繼續執行
ctrl+c----------前台進程終止
kill %n---------殺掉后台運行的進程,n表示jobnumber(通過jobs查看的進程編號,而非pid)
二、當用戶注銷或者網絡中斷時,終端后收到SIGHUP信號,從而關閉其所有子進程,以上兩種方式會隨着終端的關閉而退出,如果我們需要作業在后台執行並不受終端退出的影響,可以用下面兩種方式
1、nohup命令
nohup sh test.sh &>/dev/null &
nohup命令會忽略SIGHUP信號,從而終端退出時不會影響到后台作業
nohup $command &
可以直接在后台運行,但無法調回前台。
2、將作業掛到新的會話下面
(sh test.sh &>/dev/null &)或者將sh test.sh &>/dev/null &放到另一個腳本中運行都可以實現
將&也放入()后,我們會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來查看的,通過ps查看發現新的作業的PPID是1而不是終端的PID,所以終端退出后不會影響我們的作業
1 [root@localhost test]# jobs 2 [1]- 運行中 nohup java -Dfile.encoding=UTF-8 -Dname=Runtime-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test.jar $1 $2 $3 &(工作目錄:/home/test) 3 [2]+ 運行中 nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 & 4 5 // 使用fg 后,將任務2調至前台運行 6 [root@localhost test]# fg 2 7 nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 8 9 ^Z 10 // 使用ctrl+Z后,將任務2放置到后台,並暫停 11 [2]+ 已停止 nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 12 13 // 使用bg 后,激活任務2的運行 14 [root@localhost test]# bg 2 15 [2]+ nohup java -Dfile.encoding=UTF-8 -Dname=Container-Name -server -Xms128M -Xmx512M -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -jar test1.jar $1 $2 $3 &
三:linux的ps命令
查詢所有 ps -aux 查詢單個(xxx代表相應應用程序部分名稱) ps -aux | grep xxx


ps -ef #顯示所有當前進程 ps aux #顯示所有當前進程 ps -ax #顯示所有當前進程 ps -u pungki #根據用戶過濾進程 ps -aux --sort -pcpu | less #根據 CPU 使用來升序排序 ps -aux --sort -pmem | less #根據用戶過濾進程 ps -aux --sort -pcpu,+pmem | head -n 10 #查詢全10個使用cpu和內存最高的應用,一般自己正在運行的程序就可以顯示出來 ps -C getty #通過進程名和PID過濾 ps -f -C getty #帶格式顯示的,通過進程名和PID過濾 ps -L 1213 #根據線程來過濾進程 ps -axjf(或pstree) #樹形顯示進程 ps -eo pid,user,args # 顯示安全信息 ps -U root -u root u #格式化輸出 root 用戶(真實的或有效的UID)創建的進程
四、另外screen命令也可以實現相應的功能,並能解決程序需要人機交互的問題
系統管理員經常需要遠程登錄服務器
然后在服務器上跑一些程序
有個時候
得跑很長時間(超過12小時)
這是如果程序沒結束就退出遠程管理終端
遠程跑的程序很有可能就此當掉
以前常用的解決方式是用命令nohup
但是nohup也有很多的問題
當有了screen
這一切便都迎刃而解了
敲入命令screen
會創建一個跑着shell的單一窗口
在這里面
你可以跑你所需要的程序
然后Ctrl+a d退出剛創建的窗口(回到進入screen前的環境)
然后再敲入命令screen創建新的終端窗口
就這樣
你可以建立多個有shell的窗口(這些窗口里都可以跑你自己的應用)
這樣就是你退出遠程管理窗口(進入screen的環境)
你的screen窗間的窗口都不會關閉
里面跑得應用自然也不會當掉
用screen -ls可以看所有的screen sessions
用screen -r sessionid可以進sessionid指定的特定的screen session
最后screen session不再使用的時候
screen -r sessionid進去
exit退出即可
實例:
說明看了那么多,讓我們用一個實際例子來結束我們今天的學習。
在我們開啟一個screen后,然后使用joe編輯一個文件,之后因為臨時需要離開這時就可以運行Ctrl+a d,顯示如下:
[becks@ec-base becks]$ screen
[detached]
這個時候當我們運行ps -e 可以看到pts/2這個我剛剛運行的screen正在運行joe
6264 pts/2 00:00:00 bash
6354 pts/2 00:00:00 joe
而當我們回來后想恢復這個session,只需要鍵入screen -r,而當你有多個session時候,系統將提示你選擇一個,如下:
[becks@ec-base becks]$ screen -r
There are several suitable screens on:
6263.pts-1.ec-base (Detached)
6382.pts-1.ec-base (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
輸入該session的pid進行恢復
[becks@becks becks]$ screen -r 6263
想退出screen的session,和退出shell一樣,只需要鍵入exit命令,成功退出后將有以下提示
[screen is terminating]
kill指定用戶所有進程
nvidia-smi
nvidia-smi是用來查看GPU使用情況的。我常用這個命令判斷哪幾塊GPU空閑,但是最近的GPU使用狀態讓我很困惑,於是把nvidia-smi命令顯示的GPU使用表中各個內容的具體含義解釋一下。
這是服務器上特斯拉K80的信息。
上面的表格中:
第一欄的Fan:N/A是風扇轉速,從0到100%之間變動,這個速度是計算機期望的風扇轉速,實際情況下如果風扇堵轉,可能打不到顯示的轉速。有的設備不會返回轉速,因為它不依賴風扇冷卻而是通過其他外設保持低溫(比如我們實驗室的服務器是常年放在空調房間里的)。
第二欄的Temp:是溫度,單位攝氏度。
第三欄的Perf:是性能狀態,從P0到P12,P0表示最大性能,P12表示狀態最小性能。
第四欄下方的Pwr:是能耗,上方的Persistence-M:是持續模式的狀態,持續模式雖然耗能大,但是在新的GPU應用啟動時,花費的時間更少,這里顯示的是off的狀態。
第五欄的Bus-Id是涉及GPU總線的東西,domain:bus:device.function
第六欄的Disp.A是Display Active,表示GPU的顯示是否初始化。
第五第六欄下方的Memory Usage是顯存使用率。
第七欄是浮動的GPU利用率。
第八欄上方是關於ECC的東西。
第八欄下方Compute M是計算模式。
下面一張表示每個進程占用的顯存使用率。
顯存占用和GPU占用是兩個不一樣的東西,顯卡是由GPU和顯存等組成的,顯存和GPU的關系有點類似於內存和CPU的關系。我跑caffe代碼的時候顯存占得少,GPU占得多,跑TensorFlow代碼的時候,顯存占得多,GPU占得少。
visdom使用本地瀏覽器查看遠程服務器訓練結果