前言
在我們通常使用linux操作系統(tǒng)的時(shí)候,經(jīng)常會(huì)有這樣的需求——?dú)⑺酪粋€(gè)進(jìn)程,比如說(shuō)你一不小心啟動(dòng)了一個(gè)后臺(tái)進(jìn)程或者守護(hù)進(jìn)程,而這個(gè)進(jìn)程是你不需要的,因此你久想殺掉他,在本篇文章當(dāng)中主要給大家介紹一些殺死進(jìn)程的方法,以及這隱藏在這后面的原理。
你可以殺死哪些進(jìn)程在我們殺死一個(gè)進(jìn)程的時(shí)候最好不要使用管理員權(quán)限,因?yàn)槟憧赡軙?huì)一不小心殺死系統(tǒng)當(dāng)中一些很重要的進(jìn)程。同時(shí)需要了解,在linux當(dāng)中有很多與權(quán)限相關(guān)的操作,如果你只是一個(gè)普通的用戶,那么你就只能殺死你自己的進(jìn)程,不能夠殺死別的用戶的進(jìn)程。但是root用戶或者你有sudo權(quán)限,那么你就可以為所欲為了。
殺死進(jìn)程的基本原理:我們使用命令去殺死進(jìn)程,本質(zhì)上是通過(guò)一個(gè)進(jìn)程(比如說(shuō)kill命令的那個(gè)進(jìn)程)給另外一個(gè)進(jìn)程發(fā)送信號(hào),當(dāng)進(jìn)程接收到信號(hào)的時(shí)候就會(huì)進(jìn)行判斷是哪個(gè)信號(hào),然后根據(jù)不同的信號(hào)做出相應(yīng)的行為。
信號(hào)前面表示代表不同信號(hào)的數(shù)值,比如說(shuō)我們執(zhí)行命令 kill -9 1234 就是將 9 這個(gè)值對(duì)應(yīng)的信號(hào) SIGKILL 發(fā)送給進(jìn)程號(hào)等于 1234 的進(jìn)程,在linux操作系統(tǒng)當(dāng)中,常見(jiàn)的信號(hào)如下所示:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
對(duì)于信號(hào)來(lái)說(shuō),進(jìn)程可以有不同的應(yīng)對(duì)行為,具體來(lái)說(shuō)主要有以下三種:
忽略這個(gè)信號(hào)。使用默認(rèn)行為去處理這個(gè)信號(hào),比如SIGINT和SIGTERM這兩個(gè)信號(hào)的默認(rèn)行為就是退出程序。自己定義函數(shù)捕獲這個(gè)信號(hào),我們可以自己寫(xiě)一個(gè)函數(shù),并且使用系統(tǒng)調(diào)用將這個(gè)函數(shù)進(jìn)行注冊(cè),當(dāng)收到對(duì)應(yīng)的信號(hào)的時(shí)候就去執(zhí)行我們自己實(shí)現(xiàn)的函數(shù),但是需要注意的是,并不是所有的信號(hào)我們都可以進(jìn)行捕獲的,比如說(shuō)SIGKILL和SIGSTOP這兩個(gè)信號(hào)。程序的定位我們通常可以使用 ps 和 top 兩個(gè)命令進(jìn)行程序的定位,因此當(dāng)我們想要?dú)⑺滥硞€(gè)程序的時(shí)候我們可以通過(guò)上述兩個(gè)命令進(jìn)行程序的定位,找到我們想要?dú)⑺赖倪M(jìn)程的進(jìn)程號(hào)和進(jìn)程名字。
在本篇文章當(dāng)中主要使用一個(gè)程序 group.c 作為例子,講述各種 kill 命令的使用,他會(huì) fork 出幾個(gè)子進(jìn)程,子進(jìn)程的進(jìn)程名和它的進(jìn)程名都是 group.out,這個(gè)程序的源代碼如下所示:
#include <stdio.h>#include <unistd.h>int main() { for(int i = 0; i < 10; i++) { if(!fork()) break; } printf("進(jìn)程ID = %d 進(jìn)程組ID = %d
", getpid(), getpgid(0)); sleep(100); return 0;}使用kill命令殺死進(jìn)程
kill命令的使用方法如下所示:
kill [option] <pid> [...] # [option] 是參數(shù)選項(xiàng)比如 -9 pid 表示進(jìn)程的進(jìn)程id
發(fā)送一個(gè) SIGINT 信號(hào)給進(jìn)程 1234
kill -SIGINT 1234或者kill -2 1234
如果進(jìn)程 1234 執(zhí)行SIGINT的默認(rèn)行為的話,那么進(jìn)程1234就會(huì)退出,因?yàn)槟J(rèn)行為就是退出程序。
強(qiáng)制殺死進(jìn)程 1234
kill -SIGKILL 1234或者kill -9 1234
因?yàn)樾盘?hào) SIGKILL 是不能夠被忽略或者捕獲的,這個(gè)就是強(qiáng)制殺死程序,這條命令可以保證一定殺死進(jìn)程,但是我們一般情況下最好不要使用這條命令,因?yàn)楹芏喑绦蛴兴约旱倪壿嫞热缜謇硪恍?shù)據(jù)和系統(tǒng)資源,但是如果你不關(guān)心這些就無(wú)所謂了。
殺死所有你有權(quán)限殺死的進(jìn)程
kill -9 -1
上面的命令當(dāng)中 -1 的意思表示將 -9 這個(gè)信號(hào)發(fā)送給所有你有權(quán)限發(fā)送的進(jìn)程,這個(gè)命令慎用。
有的時(shí)候我們會(huì)有一個(gè)需求就是殺死一個(gè)進(jìn)程組里面的所有進(jìn)程,我們可以使用命令
kill [option] -<pid> [...] # [option] 是參數(shù)選項(xiàng)比如 -9 pid 表示進(jìn)程的進(jìn)程id
就是在pid前面加上-表示殺死這個(gè)進(jìn)程組,比如下面圖中的示例:
在 kill 命令當(dāng)中如果沒(méi)有指定發(fā)送那個(gè)信號(hào)的話,默認(rèn)就發(fā)送SIGTERM信號(hào),對(duì)應(yīng)的數(shù)值等于15。
pkill和pgreppgrep 命令其實(shí)就是根據(jù)正則表達(dá)式列出相應(yīng)的進(jìn)程。默認(rèn)他只會(huì)講符合要求的進(jìn)程的進(jìn)程號(hào)列出來(lái):
? pthreads pgrep out3204266320426832042693204270320427132042723204273復(fù)制代碼
比如說(shuō),列出所有含有 out 這個(gè)字符的進(jìn)程:
? pthreads pgrep -l out3204266 group.out3204268 group.out3204269 group.out3204270 group.out3204271 group.out3204272 group.out3204273 group.out復(fù)制代碼
pgrep -l out復(fù)制代碼
在上面的命令當(dāng)中 out 表示一個(gè)字符串,我們也可以使用正則表達(dá)式,-l 表示列出進(jìn)程執(zhí)行的時(shí)候的命令。
在 pgrep 當(dāng)中還有一個(gè)比較重要的選項(xiàng) -u ,這個(gè)選項(xiàng)表示根據(jù)特定的用戶篩選進(jìn)程,比如說(shuō)我們只要 abc 這個(gè)用戶的進(jìn)程,可以這樣:
pgrep -u abc out # 也是選擇含有 out 字符串的進(jìn)程
pgrep 還有一個(gè)比較重要的選項(xiàng)就是 -v ,這個(gè)選項(xiàng)的意思就是除了符合正則表達(dá)式要求的其他進(jìn)程,比如說(shuō)我們想要將所有不含 out 的進(jìn)程篩選出來(lái),就可以使用如下命令:
pgrep -v out
如果我們想要統(tǒng)計(jì)一下符合要求的進(jìn)程的個(gè)數(shù)我們可以使用下面的這個(gè)命令:
pgrep -c out # 統(tǒng)計(jì)一下含有 out 字符串的進(jìn)程的個(gè)數(shù)
pkill 的使用方式和 pgrep 是一樣的只不過(guò) pgrep 是將進(jìn)程的進(jìn)程號(hào)列出來(lái),而pkill是將一個(gè)發(fā)送給所有符合要求的進(jìn)程,默認(rèn)發(fā)送的信號(hào)是 SIGTERM 對(duì)應(yīng)的值等于 15。
比如在上圖當(dāng)中就發(fā)送一個(gè)默認(rèn)信號(hào)SIGTERM給所有命令行當(dāng)中還有字符串 out 的進(jìn)程。因此 pkill 在批處理場(chǎng)景用得比較多,將還有某個(gè)特征的進(jìn)程全部殺死。
如果你想指定具體發(fā)送那個(gè)信號(hào)格式和 kill 是一樣的,比如發(fā)送 SIGKILL(-9)信號(hào)給含有字符串 out 的進(jìn)程。
pkill -9 out或者pkill -SIGKILL out使用killall命令
Killall 和 pkill 使用方法差不多,而且含義也一致,將符合條件的進(jìn)程全部殺死。默認(rèn)發(fā)送的信號(hào)也是SIGTERM,信號(hào)值等于15,但是pkill不同的是 killall 默認(rèn)不開(kāi)啟正則表達(dá)式,我們需要通過(guò) -r 選項(xiàng)啟動(dòng)正則表達(dá)式識(shí)別。
例子如下所示:
如果我們想在不實(shí)用 -r 選項(xiàng)的情況下殺死進(jìn)程,只能輸入進(jìn)程的全稱了。
在killall命令當(dāng)中還有一些常用的選項(xiàng):
選項(xiàng)
含義
-u
只殺死指定用戶的進(jìn)程,比如說(shuō) -u abc 只殺死用戶 abc 滿足要求的進(jìn)程
-I
字母大小寫(xiě)不敏感
-i
交互模式,每次殺死進(jìn)程都會(huì)詢問(wèn)是否殺死進(jìn)程
-r
表示使用正則表達(dá)式進(jìn)行匹配
-數(shù)字或者信號(hào)名
發(fā)送特定的信號(hào),如下的例子所示
| |
為什么我們不能夠捕獲所有的信號(hào)在前面的文章當(dāng)中我們提到了,SIGKILL和SIGSTOP這兩個(gè)信號(hào)是不能夠被捕獲的!試想一下,在你的系統(tǒng)的當(dāng)中有一個(gè)病毒程序,他會(huì)不斷的創(chuàng)建新的進(jìn)程并且不斷的申請(qǐng)系統(tǒng)資源,那么你還沒(méi)有辦法殺死他,你只能夠眼睜睜的看著你的系統(tǒng)卡死。這種問(wèn)題 linux 設(shè)計(jì)者早就想到了,基于這個(gè)問(wèn)題就肯定需要有一種方式能夠萬(wàn)無(wú)一失的殺掉進(jìn)程,因?yàn)槲覀儾荒軌蜃屢粋€(gè)進(jìn)程無(wú)休止的消耗系統(tǒng)資源而我們卻無(wú)能為力,因此才出現(xiàn)了不能夠被捕獲的信號(hào),因?yàn)檫@個(gè)能夠確保殺死進(jìn)程。
總結(jié)在本篇文章當(dāng)中主要給大家介紹各種 kill 命令的使用方法以及一些簡(jiǎn)單的信號(hào)含義的介紹,這部分內(nèi)容在我們平常的學(xué)習(xí)工作過(guò)程當(dāng)中經(jīng)常會(huì)使用到,希望大家有所收獲~
本文發(fā)布于:2023-02-28 21:08:00,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://m.newhan.cn/zhishi/a/1677729540100466.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:結(jié)束進(jìn)程命令(強(qiáng)制結(jié)束進(jìn)程命令).doc
本文 PDF 下載地址:結(jié)束進(jìn)程命令(強(qiáng)制結(jié)束進(jìn)程命令).pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |