RHEL6基础之十八Linux中Kill进程的方法
Linux中的kill命令用來終止指定的進程(terminate?a?process)的運行,是Linux下進程管理的常用命令。工作原理是向Linux系統的內核發送一個系統操作信號和某個程序的進程標識號,然后系統內核就可以對進程標識號指定的進程進行操作,通常,終止一個前臺進程可以使用Ctrl+C鍵,但是,對于一個后臺進程就須用kill命令來終止,我們就需要先使用ps/pgrep/pidof/pstree/top等工具獲取進程PID,然后使用kill命令來殺掉該進程。kill命令是通過向進程發送指定的信號來結束相應進程的。在默認情況下,采用編號為15的TERM信號。TERM信號將終止所有不能捕獲該信號的進程。對于那些可以捕獲該信號的進程就要用編號為9的kill信號,強行“殺掉”該進程。?
一、獲取進程PID
1、ps -ef
[root@justin?conf]#?ps?-ef UID????????PID??PPID??C?STIME?TTY??????????TIME?CMD root?????????1?????0??0?14:09??????????00:00:02?/sbin/init root?????????2?????0??0?14:09??????????00:00:00?[kthreadd] root?????????3?????2??0?14:09??????????00:00:00?[migration/0] root?????????4?????2??0?14:09??????????00:00:00?[ksoftirqd/0] root?????????5?????2??0?14:09??????????00:00:00?[migration/0]
2、ps -aux
[root@justin?conf]#?ps?aux USER???????PID?%CPU?%MEM????VSZ???RSS?TTY??????STAT?START???TIME?COMMAND root?????????1??0.4??0.1???2872??1424??????????Ss???14:09???0:02?/sbin/init root?????????2??0.0??0.0??????0?????0??????????S????14:09???0:00?[kthreadd] root?????????3??0.0??0.0??????0?????0??????????S????14:09???0:00?[migration/0] root?????????4??0.0??0.0??????0?????0??????????S????14:09???0:00?[ksoftirqd/0]
3、精確查找進程PID
3.1通過管道符、grep
[root@localhost?~]#?ps?aux|grep?firefox root??????2276??3.4??5.7?318708?59268??????????Sl???04:57???0:02?/usr/lib/firefox-3.6.18/firefox-bin root??????2344??0.0??0.0???4356???728?pts/0????S+???04:58???0:00?grep?firefox [root@localhost?~]#
3.2、pgrep
pgrep的p表明了這個命令是專門用于進程查詢的grep
[root@localhost?~]#?pgrep?firefox 2276 [root@localhost?~]#
3.3、pidof--pid of xx
pid of xx,字面翻譯過來就是 xx的PID,和pgrep相比稍顯不足的是,pidof必須給出進程的全名
[root@localhost?~]#?pidof?firefox-bin 2276 [root@localhost?~]#
二、Kill命令結束指定進程
1、命令格式:
kill[參數][進程號pid]
2.命令功能:
發送指定的信號到相應進程。不指定型號將發送SIGTERM(15)終止指定進程。如果任無法終止該程序可用“-KILL”?參數,其發送的信號為SIGKILL(9)?,將強制結束進程,使用ps命令或者jobs?命令可以查看進程號。root用戶將影響用戶的進程,非root用戶只能影響自己的進程。
3.命令參數:
-l??信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱,eg:[root@localhost ~]# kill -l
-a??當處理當前進程時,不限制命令名和進程號的對應關系
-p??指定kill?命令只打印相關進程的進程號,而不發送任何信號
-s??指定發送信號
-u??指定用戶?
注意:
1、kill命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill命令就會發出終止信號(15),這個信號可以被進程捕獲,使得進程在退出之前可以清理并釋放資源。也可以用kill向進程發送特定的信號。例如:
kill?-2?123
它的效果等同于在前臺運行PID為123的進程時按下Ctrl+C鍵。但是,普通用戶只能使用不帶signal參數的kill命令或最多使用-9信號。
2、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用kill信號(9),因為進程不能首先捕獲它。要撤銷所有的后臺作業,可以輸入kill?0。因為有些在后臺運行的命令會啟動多個進程,跟蹤并找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill?0來終止所有由當前shell啟動的進程,是個有效的方法。
只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。下面是常用的信號:
HUP????1????終端斷線,如果想要更改配置而不需停止并重新啟動服務,可以使用zhe個命令
INT?????2????中斷(同?Ctrl?+?C)
QUIT????3????退出(同?Ctrl?+?\)
TERM???15????終止
KILL????9????強制終止
CONT???18????繼續(與STOP相反,?fg/bg命令)
STOP????19????暫停(同?Ctrl?+?Z)
USR1 ? ? ? ?通常被用來告知應用程序重載配置文件;例如,向Apache HTTP服務器發送一個USR1信號將導致以下步驟的發生:停止接受新的連接,等待當前連接停止,重新載入配置文件,重新打開日志文件,重啟服務器,從而實現相對平滑的不關機的更改。
這些signal可以通過kill -l查看
[root@finchina?~]#?kill?-l1)?SIGHUP ?2)?SIGINT ?3)?SIGQUIT ?4)?SIGILL ?5)?SIGTRAP6)?SIGABRT ?7)?SIGBUS ?8)?SIGFPE ?9)?SIGKILL 10)?SIGUSR1 11)?SIGSEGV 12)?SIGUSR2 13)?SIGPIPE 14)?SIGALRM 15)?SIGTERM 16)?SIGSTKFLT 17)?SIGCHLD 18)?SIGCONT 19)?SIGSTOP 20)?SIGTSTP 21)?SIGTTIN 22)?SIGTTOU 23)?SIGURG 24)?SIGXCPU 25)?SIGXFSZ 26)?SIGVTALRM 27)?SIGPROF 28)?SIGWINCH 29)?SIGIO 30)?SIGPWR 31)?SIGSYS 34)?SIGRTMIN 35)?SIGRTMIN+1 36)?SIGRTMIN+2 37)?SIGRTMIN+3 38)?SIGRTMIN+4 39)?SIGRTMIN+5 40)?SIGRTMIN+6 41)?SIGRTMIN+7 42)?SIGRTMIN+8 43)?SIGRTMIN+9 44)?SIGRTMIN+10 45)?SIGRTMIN+11 46)?SIGRTMIN+12 47)?SIGRTMIN+13 48)?SIGRTMIN+14 49)?SIGRTMIN+15 50)?SIGRTMAX-14 51)?SIGRTMAX-13 52)?SIGRTMAX-12 53)?SIGRTMAX-11 54)?SIGRTMAX-10 55)?SIGRTMAX-9 56)?SIGRTMAX-8 57)?SIGRTMAX-7 58)?SIGRTMAX-6 59)?SIGRTMAX-5 60)?SIGRTMAX-4 61)?SIGRTMAX-3 62)?SIGRTMAX-2 63)?SIGRTMAX-1 64)?SIGRTMAX [root@finchina?~]#3、init是Linux系統操作中不可缺少的程序之一。所謂的init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,并已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)。?其它所有進程都是init進程的子孫。init進程是不可殺的!
4、USR1亦通常被用來告知應用程序重載配置文件;例如,向Apache HTTP服務器發送一個USR1信號將導致以下步驟的發生:停止接受新的連接,等待當前連接停止,重新載入配置文件,重新打開日志文件,重啟服務器,從而實現相對平滑的不關機的更改。
kill?-USR1?`cat?/usr/local/nginx/logs/nginx.pid`4、實例
4.1終止firefox進程
[root@localhost?~]#?pgrep?firefox 3049 [root@localhost?~]#?ps?-ef|grep?firefox root??????3049?????1??2?07:36??????????00:00:00?/usr/lib/firefox/firefox root??????3089??2979??0?07:37?pts/0????00:00:00?grep?firefox [root@localhost?~]#?kill?3049 [root@localhost?~]#4.2改進1
[root@localhost?~]#?kill?-9?$(pgrep?firefox) [root@localhost?~]#$( )的用途和反引號` `一樣,用來表示優先執行的命令,這里的kill -9 $(pgrep firefox)表示先執行pgrep firefox再kill -9 結束該進程
4.3改進2--pkill
pkill=pgrep+kill
[root@localhost?~]#?pkill?firefox [root@localhost?~]#?pkill?-9?firefox [root@localhost?~]#"-9" 即發送的信號是9,pkill與kill在這點的差別是:pkill無須 “s”,終止信號等級直接跟在 “-“ 后面。之前我一直以為是 "-s 9",結果每次運行都無法終止進程。
4.3改進3-killall
killall命令殺死同一進程組內的所有進程。其允許指定要終止的進程的名稱,而非PID,和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。pkill或者pgrep只要給出進程名的一部分就可以終止進程。
[root@localhost?~]#?killall?httpd [root@localhost?~]#
轉載于:https://blog.51cto.com/ityunwei2017/1313927
總結
以上是生活随笔為你收集整理的RHEL6基础之十八Linux中Kill进程的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库操作流程
- 下一篇: EPOLL 事件之 EPOLLRDHUP