1.查進程
ps命令查找與進程相關的PID號:
ps a 顯示現行終端機下的所有程序,包括其他用戶的程序。
ps -A 顯示所有程序。
ps c 列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數或常駐服務的標示。
ps -e 此參數的效果和指定”A”參數相同。
ps e 列出程序時,顯示每個程序所使用的環境變量。
ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關係。
ps -H 顯示樹狀結構,表示程序間的相互關係。
ps -N 顯示所有的程序,除了執行ps指令終端機下的程序之外。
ps s 採用程序信號的格式顯示程序狀況。
ps S 列出程序時,包括已中斷的子程序資料。
ps -t<終端機編號> 指定終端機編號,並列出屬於該終端機的程序的狀況。
ps u 以用戶爲主的格式來顯示程序狀況。
ps x 顯示所有程序,不以終端機來區分。
常用的方法是ps aux,然後再通過管道使用grep命令過濾查找特定的進程,然後再對特定的進程進行操作。
ps aux | grep program_filter_word,ps -ef |grep tomcat
ps -ef|grep java|grep -v grep 顯示出所有的java進程,去處掉當前的grep進程。
2.殺進程
1.命令格式:
kill [參數] [進程號]
2.命令功能:
發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程序可用“-KILL” 參數,其發送的信號爲SIGKILL(9) ,將強制結束進程,使用ps命令或者jobs 命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
3.命令參數:
-l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱
-a 當處理當前進程時,不限制命令名和進程號的對應關係
-p 指定kill 命令只打印相關進程的進程號,而不發送任何信號
-s 指定發送信號
-u 指定用戶
注意:
1、kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用kill向進程發送特定的信號。例如:
kill -2 123
它的效果等同於在前臺運行PID爲123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。
2、kill可以帶有進程ID號作爲參數。當用kill向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。
3、可以向多個進程發信號或終止它們。
4、當kill成功地發送了信號後,shell會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下Enter鍵使shell的命令提示符再次出現時,纔會顯示出來。
5、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因爲進程不能首先捕獲它。要撤銷所有的後臺作業,可以輸入kill 0。因爲有些在後臺運行的命令會啓動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啓動的進程,是個有效的方法。
4.使用實例:
實例1:列出所有信號名稱
命令:
kill -l
輸出:
[root@localhost test6]# kill -l
-
SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
-
SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
-
SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
-
SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
-
SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
-
SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
-
SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
-
SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
-
SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
-
SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
-
SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
-
SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
-
SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
-
SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
-
SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
-
SIGRTMAX-1 64) SIGRTMAX
說明:
只有第9種信號(SIGKILL)纔可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號:
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
實例2:得到指定信號的數值
命令:
輸出:
[root@localhost test6]# kill -l KILL
9[root@localhost test6]# kill -l SIGKILL
9[root@localhost test6]# kill -l TERM
15[root@localhost test6]# kill -l SIGTERM
15[root@localhost test6]#
說明:
實例3:先用ps查找進程,然後用kill殺掉
命令:
kill 3268
輸出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 沒有那個進程
[root@localhost test6]#
說明:
實例4:徹底殺死進程
命令:
kill –9 3268
輸出:
[root@localhost test6]# ps -ef|grep vim
root 3268 2884 0 16:21 pts/1 00:00:00 vim install.log
root 3370 2822 0 16:21 pts/0 00:00:00 grep vim
[root@localhost test6]# kill –9 3268
[root@localhost test6]# kill 3268
-bash: kill: (3268) - 沒有那個進程
[root@localhost test6]#
說明:
實例5:殺死指定用戶所有進程
命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
輸出:
[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux)
[root@localhost ~]# kill -u peidalinux
說明:
方法一,過濾出hnlinux用戶進程並殺死
實例6:init進程是不可殺的
命令:
kill -9 1
輸出:
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17563 17534 0 17:37 pts/1 00:00:00 grep init
[root@localhost ~]# kill -9 1
[root@localhost ~]# kill -HUP 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17565 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]# kill -KILL 1
[root@localhost ~]# ps -ef|grep init
root 1 0 0 Nov02 ? 00:00:00 init [3]
root 17567 17534 0 17:38 pts/1 00:00:00 grep init
[root@localhost ~]#
說明:
init是Linux系統操作中不可缺少的程序之一。所謂的init進程,它是一個由內核啓動的用戶級進程。內核自行啓動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啓動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終爲1)。 其它所有進程都是init進程的子孫。init進程是不可殺的!