Linux中Kill掉進(jìn)程的10種方法

常規(guī)篇:
首先,用ps查看進(jìn)程,方法如下:
$ ps -ef
……
smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
smx 1824 1822 0 11:38 pts/0 00:00:02 bash
smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 1822 0 11:38 pts/1 00:00:00 bash
smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
……
smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef
或者:
$ ps -aux
……
smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
smx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash
smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash
smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
……
smx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux
此時(shí)如果我想殺了火狐的進(jìn)程就在終端輸入:
$ kill -s 9 1827
其中-s 9 制定了傳遞給進(jìn)程的信號(hào)是9,即強(qiáng)制、盡快終止進(jìn)程。各個(gè)終止信號(hào)及其作用見附錄。
進(jìn)階篇:
改進(jìn)1:
把ps的查詢結(jié)果通過管道給grep查找包含特定字符串的進(jìn)程。管道符“|”用來隔開兩個(gè)命令,管道符左邊命令的輸出會(huì)作為管道符右邊命令的輸入。
$ ps -ef | grep firefox
smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox
這次就清爽了。然后就是
$kill -s 9 1827
改進(jìn)2——使用pgrep:
一看到pgrep首先會(huì)想到什么?沒錯(cuò),grep!pgrep的p表明了這個(gè)命令是專門用于進(jìn)程查詢的grep。
$ pgrep firefox
1827
看到了什么?沒錯(cuò)火狐的PID,接下來又要打字了:
$kill -s 9 1827
改進(jìn)3——使用pidof:
看到pidof想到啥?沒錯(cuò)pid of xx,字面翻譯過來就是 xx的PID。
$ pidof firefox-bin
1827
和pgrep相比稍顯不足的是,pidof必須給出進(jìn)程的全名。然后就是老生常談:
$kill -s 9 1827
無論使用ps 然后慢慢查找進(jìn)程PID 還是用grep查找包含相應(yīng)字符串的進(jìn)程,亦或者用pgrep直接查找包含相應(yīng)字符串的進(jìn)程PID,然后手動(dòng)輸入給kill殺掉,都稍顯麻煩。有沒有更方便的方法?有!
改進(jìn)4:
$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9
說明:
“grep firefox”的輸出結(jié)果是,所有含有關(guān)鍵字“firefox”的進(jìn)程。
“grep -v grep”是在列出的進(jìn)程中去除含有關(guān)鍵字“grep”的進(jìn)程。
“cut -c 9-15”是截取輸入行的第9個(gè)字符到第15個(gè)字符,而這正好是進(jìn)程號(hào)PID。
“xargs kill -s 9”中的xargs命令是用來把前面命令的輸出結(jié)果(PID)作為“kill -s 9”命令的參數(shù),并執(zhí)行該命令。“kill -s 9”會(huì)強(qiáng)行殺掉指定進(jìn)程。
難道你不想抱怨點(diǎn)什么?沒錯(cuò)太長了
改進(jìn)5:
知道pgrep和pidof兩個(gè)命令,干嘛還要打那么長一串!
$ pgrep firefox | xargs kill -s 9
改進(jìn)6:
$ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9
kill: No such process
有一個(gè)比較郁悶的地方,進(jìn)程已經(jīng)正確找到并且終止了,但是執(zhí)行完卻提示找不到進(jìn)程。
其中awk '{print $2}' 的作用就是打印(print)出第二列的內(nèi)容。根據(jù)常規(guī)篇,可以知道ps輸出的第二列正好是PID。就把進(jìn)程相應(yīng)的PID通過xargs傳遞給kill作參數(shù),殺掉對(duì)應(yīng)的進(jìn)程。
改進(jìn)7:
難道每次都要調(diào)用xargs把PID傳遞給kill?答案是否定的:
$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`
改進(jìn)8:
沒錯(cuò),命令依然有點(diǎn)長,換成pgrep。
$kill -s 9 `pgrep firefox`
改進(jìn)9——pkill:
看到pkill想到了什么?沒錯(cuò)pgrep和kill!pkill=pgrep+kill。
$pkill -9 firefox
說明:"-9" 即發(fā)送的信號(hào)是9,pkill與kill在這點(diǎn)的差別是:pkill無須 “s”,終止信號(hào)等級(jí)直接跟在 “-“ 后面。之前我一直以為是 "-s 9",結(jié)果每次運(yùn)行都無法終止進(jìn)程。
改進(jìn)10——killall:
killall和pkill是相似的,不過如果給出的進(jìn)程名不完整,killall會(huì)報(bào)錯(cuò)。pkill或者pgrep只要給出進(jìn)程名的一部分就可以終止進(jìn)程。
$killall -9 firefox
附錄:各種信號(hào)及其用途
Signal Description Signal number on Linux x86[1]
SIGABRT Process aborted 6
SIGALRM Signal raised by alarm 14
SIGBUS Bus error: "access to undefined portion of memory object" 7
SIGCHLD Child process terminated, stopped (or continued*) 17
SIGCONT Continue if stopped 18
SIGFPE Floating point exception: "erroneous arithmetic operation" 8
SIGHUP Hangup 1
SIGILL Illegal instruction 4
SIGINT Interrupt 2
SIGKILL Kill (terminate immediately) 9
SIGPIPE Write to pipe with no one reading 13
SIGQUIT Quit and dump core 3
SIGSEGV Segmentation violation 11
SIGSTOP Stop executing temporarily 19
SIGTERM Termination (request to terminate) 15
SIGTSTP Terminal stop signal 20
SIGTTIN Background process attempting to read from tty ("in") 21
SIGTTOU Background process attempting to write to tty ("out") 22
SIGUSR1 User-defined 1 10
SIGUSR2 User-defined 2 12
SIGPOLL Pollable event 29
SIGPROF Profiling timer expired 27
SIGSYS Bad syscall 31
SIGTRAP Trace/breakpoint trap 5
SIGURG Urgent data available on socket 23
SIGVTALRM Signal raised by timer counting virtual time: "virtual timer expired" 26
SIGXCPU CPU time limit exceeded 24
SIGXFSZ File size limit exceeded 25
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤信息? 查看Linux硬盤大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過程中,查看和了解硬盤信息是非常重要的工作,尤其是對(duì)于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細(xì)信息? 3招輕松查看CPU型號(hào)、核心數(shù)和溫度
在日常運(yùn)維工作中,獲取 CPU 信息是系統(tǒng)運(yùn)維管理員常見的工作內(nèi)容,無論是為了性能調(diào)優(yōu)、硬件升級(jí)還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨(dú)樹一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡(jiǎn)化,優(yōu)化,現(xiàn)代化,實(shí)用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來簡(jiǎn)要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機(jī)U盤?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個(gè)win11裝機(jī)u盤,詳細(xì)如下2025-02-17Rsnapshot怎么用? 基于Rsync的強(qiáng)大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過 SSH 備份遠(yuǎn)程文件,接下來詳細(xì)介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時(shí)、每天、每周和每月的本地備份,以及如何進(jìn)2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡(jiǎn)化內(nèi)核搶占邏輯,通過減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運(yùn)行時(shí)表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來了諸多優(yōu)化和改進(jìn),進(jìn)一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來看看詳細(xì)安裝指南2025-01-16