Linux中關於進程任務處理的幾個命令


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 -aux|grep pascal_ voc.py這個語句可以查看自己的命令含有pascal_ voc.py的所有進程
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使用本地瀏覽器查看遠程服務器訓練結果

 linux進程狀態

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM