在工作中,我常常需要終止有問題的進程,一般通過程序的關閉命令把進程關閉掉,這是最安全的方法,但是有些時候,我們無法通過關閉命令把進程結束掉,這時就需要通過殺死進程的方法來結束這個有問題的進程。而殺進程的方法有很多,常見的有kill、killall、pkill等。最安全的方法是單純使用kill命令。
1、kill
使用kill命令需要我們先查到進程的PID,方法:
ps auxf#查到我們需要殺掉的進程PID,由於進程較多,我們通常使用:
ps auxf|grep 進程名
例如:殺掉rpcbind進程
Kill殺掉掉rpcbind進程,只殺死父進程,但是子進程還存在,因此仍消耗資源,爲了節約系統資源,以及防止“殭屍進程”,我們應該在殺死父進程之前,先殺死其所有的子進程。
必殺技 kill -9 PID(-9是kill信號)
此命令是比較危險的,不建議使用,有可能會是系統崩潰,或者系統關機等風險。
信號對照表:
數字 | 信號 | 描述 |
1 | HUP | 掛起,用來在終端丟失連接的時候通報 |
2 | INT | 中斷,當用戶點擊中斷(Ctrl+C)的時候發送 |
3 | QUIT | 退出(Ctrl+\),會生成內存轉儲 |
4 | ILL | 執行了非法指令. 通常是因爲可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號 |
5 | TRAP | 由斷點指令或其它trap指令產生,由debugger使用 |
6 | ABRT | 通過C函數abort()發送,爲assert()使用 |
7 | BUS | 非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數, 但其地址不是4的倍數。它與SIGSEGV的區別在於後者是由於對合法存儲地址的非法訪問觸發的(如訪問不屬於自己存儲空間或只讀存儲空間) |
8 | FPE | 在發生致命的算術運算錯誤時發出,不僅包括浮點運算錯誤, 還包括溢出及除數爲0等其它所有的算術的錯誤 |
9 | KILL | 迅速完全終止進程,不能被捕獲,本信號不能被阻塞、處理和忽略 |
10 | USR1 | 用戶定義的信號1 |
11 | SEGV | 試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據 |
12 | USR2 | 用戶定義的信號2 |
13 | PIPE | 管道破裂。這個信號通常在進程間通信產生,比如採用FIFO(管道)通信的兩個進程,讀管道沒打開或者意外終止就往管道寫,寫進程會收到SIGPIPE信號。此外用Socket通信的兩個進程,寫進程在寫Socket的時候,讀進程已經終止 |
14 | ALRM | 時鐘定時信號, 計算的是實際的時間或時鐘時間。alarm函數使用該信號 |
15 | TERM | 常規的終止進程,可以被阻塞和處理 |
16 | STKFLT | (TODO) |
17 | CHLD | 一個子進程剛剛終止或者改變狀態 |
18 | CONT | 用SIGSTOP終止後繼續運行 |
19 | STOP | 中斷進程,不能被捕獲(Ctrl+Z) |
20 | TSTP | 中斷進程,可以被捕獲 |
21 | TTIN | 當後臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號。缺省時這些進程會停止執行 |
22 | TTOU | 類似於SIGTTIN, 但在寫終端(或修改終端模式)時收到 |
23 | URG | 有"緊急"數據或out-of-band數據到達socket時產生 |
24 | XCPU | CPU超時,這個限制可以由getrlimit/setrlimit來讀取/改變 |
25 | XFSZ | 文件大小超過限度 |
26 | VTALRM | 虛擬時鐘信號。類似於SIGALRM, 但是計算的是該進程佔用的CPU時間 |
27 | PROF | 類似於SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間 |
28 | WINCH | 窗口大小改變時發出 |
29 | POLL | (IO)文件描述符準備就緒, 可以開始進行輸入/輸出操作 |
30 | PWR | Power failure |
31 | SYS | 非法的系統調用 |
2、killall命令
該命令是殺死一個進程組的所有進程,指定要終止的進程的名字,而不是PID。
例如:殺死apache進程
killall httpd
3、pkill命令
該命令可以按照進程名殺死進程。pkill和killall應用方法差不多,也是直接殺死運行中的程序;如果您想殺掉單個進程,請用kill來殺掉。
語法
pkill(選項)(參數)
選項
-o:僅向找到的最小(起始)進程號發送信號;
-n:僅向找到的最大(結束)進程號發送信號;
-P:指定父進程號發送信號;
-g:指定進程組;
-t:指定開啓進程的終端。
例:
pkill httpd