1. 在 LINUX 命令平台輸入 1-2 個字元後按 Tab 鍵會自動補全後面的部分(前提是要有這個東西,例如在裝了 tomcat 的前提下, 輸入 tomcat 的 to 按 tab)。
2. ps 命令用於查看當前正在啟動並執行進程。
grep 是搜尋
例如: ps -ef | grep java
表示查看所有進程裡 CMD 是 java 的進程資訊
ps -aux | grep java
-aux 顯示所有狀態
ps
3. kill 命令用於終止進程
例如: kill -9 [PID]
-9 表示強迫進程立即停止
通常用 ps 查看進程 PID ,用 kill 命令終止進程
網上關於這兩塊的內容
4.大量刪除進程
介紹兩種方法。要kill的進程都有共同的字串。
| 代碼如下 |
複製代碼 |
[plain] kill -9 `ps -ef |grep xxx|awk '{print $2}' `
|
kill -9後面的符號是Tab鍵上方那個。
如上就是kill -9 `列出進程,找到包含xxx的行,輸出pid的列`
kill、ps、grep都是很常用的命令了。
awk的作用是輸出某一列,{print $2}就是輸出第二列,如上即是pid這一列。這裡有一篇awk的教程
| 代碼如下 |
複製代碼 |
[plain] ps -ef | grep xxx | grep -v root | awk '{print $2}' | xargs kill -9
|
grep -v這個參數的作用是排除某個字元。所以這裡排除了root執行的命令。
之後也利用awk找到pid這一列。
最後的xargs是從標準輸出擷取參數並執行命令的程式,即從前面的命令擷取輸出作為參數來執行下一個命令。
5.清理殭屍進程
例
今天在維護伺服器的時候,發現有5個nova-novncproxy的殭屍進程。
?
26327 ? S 0:05 _ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf
4765 ? Z 0:00 _ [nova-novncproxy] <defunct>
4766 ? Z 0:00 _ [nova-novncproxy] <defunct>
4767 ? Z 0:00 _ [nova-novncproxy] <defunct>
4768 ? Z 0:00 _ [nova-novncproxy] <defunct>
4769 ? Z 0:00 _ [nova-novncproxy] <defunct>
一般殭屍進程很難直接kill掉,不過您可以kill殭屍爸爸。父進程死後,殭屍進程成為”孤兒進程”,過繼給1號進程init,init始終會負責清理殭屍進程.它產生的所有殭屍進程也跟著消失。
| 代碼如下 |
複製代碼 |
ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9 或 kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’` |
當然您可以自己編寫更好的shell指令碼,歡迎與大家分享。
我將nova-novncproxy stop後再start,殭屍進程即消失,問題解決。
另外子進程死後,會發送SIGCHLD訊號給父進程,父進程收到此訊號後,執行waitpid()函數為子進程收屍。就是基於這樣的原理:就算父進程沒有調用wait,核心也會向它發送SIGCHLD訊息,而此時,儘管對它的預設處理是忽略,如果想響應這個訊息,可以設定一個處理函數。
6.如何避免殭屍進程呢?
處理SIGCHLD訊號並不是必須的。但對於某些進程,特別是伺服器處理序往往在請求到來時產生子進程處理請求。如果父進程不等待子進程結束,子進程將成為殭屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器處理序的並發效能。在Linux下 可以簡單地將 SIGCHLD訊號的操作設為SIG_IGN。
signal(SIGCHLD,SIG_IGN);
這樣,核心在子進程結束時不會產生殭屍進程。這一點與BSD4不同,BSD4下必須顯式等待子進程結束才能釋放殭屍進程
或者
用兩次fork(),而且使緊跟的子進程直接退出,是的孫子進程成為孤兒進程,從而init進程將負責清除這個孤兒進程。