要殺死一個進程,你會怎么做?
是:
```shell
# 1. 找到 PID
$ ps -ef | grep <進程名>
# 2. 殺死進程
$ kill -9 <PID>
```
還是:
```shell
$ killall <進程名>
```
或是:
```shell
$ pkill <進程名>
```
再或者用其他什么命令。
上面這些命令,有的通過 PID 殺死一個進程,有的通過進程名殺死一類進程,如果要搜索還得記著搜索命令是什么。
對于不常使用命令的人來說,可能根本記不住這么多命令,當然可能也沒必要記住。
如果有哪個命令能集所有能力(查看/搜索/殺死進程)于一身,那該多好,這樣只要學習一個命令就可以了。
正好`fkill`就具備這種能力。

<a name="mGzZO"></a>
# 簡介
**Fkill **的全稱是 **F**abulously **kill**,直譯為**絕殺**,它用一種更簡單和直接的方式殺死進程。
傳統殺進程的方式最大的問題就是不直觀,功能太分散,而`fkill` 可以交互式的選擇、搜索和殺死進程,高亮顯示關鍵信息。在功能上,支持通過 PID、進程名、應用名殺進程,支持同時殺死多個進程。當然,這還沒完,`fkill` 除了支持殺死進程外,還支持關閉端口。
正是因為有這么多殺招, Fkill 才能稱之為“絕殺”。
**基本信息**
| **名稱** | **Fkill** |
| --- | --- |
| **當前版本** | 7.1.0 |
| **開發語言** | JavaScript(100%) |
| **適用平臺** | macOS、Linux、Windows |
| **開源地址** | [https://github.com/sindresorhus/fkill-cli](https://github.com/sindresorhus/fkill-cli) |
| **當前星標** | 6.6k |
**功能特性**
- 可以交互式搜索、篩選進程,然后回車殺死進程;
- 可以通過 PID、進程名、應用名直接殺死進程;
- 可以通過端口號關閉端口;
- 可以同時關閉端口、殺死進程、終止程序;
- macOS 上還能顯示進程的內存和CPU使用率。
這些功能特性下面都會演示,不過,在使用前得先準備好環境。
<a name="hHLS8"></a>
# 環境準備
Fkill 是用 Node.js 開發的,因此各個平臺上的安裝方式比較統一,只需使用 npm 全局安裝就可以了。
**安裝命令:**
```shell
npm install --global fkill-cli
```
安裝完成后就可以使用了。
**查看幫助:**
```shell
$ fkill --help
Fabulously kill processes. Cross-platform.
用法
$ fkill [<pid|name|:port> …]
選項
--force -f 強制 kill
--verbose -v 顯示過程參數
--silent -s 靜默 kill
--force-after-timeout <N>, -t <N> 強制終止 N 秒后未退出的進程
示例
$ fkill 1337
$ fkill safari
$ fkill :8080
$ fkill 1337 safari :8080
$ fkill
```
<a name="X0VkQ"></a>
# 快速開始
接下來我們快速走一遍 `fkill` 的操作流程,以便建立起一些基本的概念。
**STEP 1. 直接運行 **`**fkill**`** 命令會進入交互模式**
在交互模式下可以查看所有進程信息、選擇/篩選進程、回車殺死進程。
**在 CentOS 上的效果,如下圖所示:**<br />

<br />**Running processes** 下面是所有進程的列表,當前選中的進程被高亮顯示,一行的信息從左到右分別是:應用名、PID 和端口號(在終端最右)。移動光標可上下選擇,鍵入關鍵字可過濾進程。
**在 macOS 上的效果,如下圖所示:**
```shell
$ fkill
? Running processes: (Use arrow keys or type to search)
? /Applications/Go 87912 ??13.2% ??1.3%
com.docker.hyper 85466 ??5% ??2.3%
/Applications/iT 692 ??5.4%
/Applications/? / 50819 ??3.4%
/Applications/Go 1128 ??1.3%
/Applications/Go 697 ??1.6%
/Applications/? / 50814 ??1.3%
/Applications/? / 50815 ??1.5%
/Applications/Go 1242 ??1.3%
/Applications/Go 68930 ??1.3%
(Move up and down to reveal more choices)
```
如上所示,正在運行的進程都被列出來了,在此交互模式下,**??n%** 表示 CPU 使用率高,**?? n% **表示內存使用率高。
> 注意:這個界面適配的不是很好,進程名都沒有顯示全,中文還有亂碼,希望作者盡快修復吧。
**STEP 2. 通過光桿上下移動選擇某個進程**
回車后選中的進程被終止,所下所示:
```shell
$ fkill
? Running processes: com.docker.hyper 94274
??2.3%
```
**STEP 3. 輸入進程名會過濾進程(進程名不區分大小寫)**
```shell
$ fkill
? Running processes: hy # 輸入了 hy,就會過濾帶 hy 關鍵字的進程
? com.docker.hyper 95063 ??3.4% ??2.3%
/Applications/Hy 84572 :59055
```
最左邊的`>` 表示選中行,被選中的行也會高亮顯示,通過光標可上下移動選擇行,回車后就會殺死當前選中的進程。
**STEP 4. 按下 control + c/Ctrl + C 退出交互模式**
以上就是 `fkill` 命令基本的使用方式。
<a name="BxvO8"></a>
# 使用指南
<a name="oABcd"></a>
## 1. 如何通過進程 ID 殺死進程?
`fkill` 支持殺死一個或同時殺死多個進程。
命令格式:
```shell
# 殺死一個進程
$ fkill <PID>
# 殺死多個進程
$ fkill <PID> <PID> <PID>
```
<a name="1HvTp"></a>
## 2. 如何關閉端口?
如果使用 `fkill` 關閉端口,需要在端口號前面加上冒號。
命令格式:
```shell
$ fkill :端口號
```
如,關閉 8080 端口:
```shell
# 關閉一個端口
$ fkill :8080
# 關閉多個端口
$ fkill :8080 :6060
```
<a name="SYpF8"></a>
## 3. 如何終止應用程序?
`fkill` 也可以直接終止一個應用程序。
命令格式:
```shell
$ fkill 應用程序名
```
如,關閉 firefox:
```shell
# 關閉一個應用
$ fkill firefox
# 關閉多個應用
$ fkill firefox safari
```
<a name="Tlpg3"></a>
## 4. 如何同時殺死進程、關閉端口、終止應用程序?
`fkill` 不僅可以分別殺死進程、關閉端口、終止應用程序,也可以同時做這些。
如,同時殺死進程、關閉端口、終止應用程序:
```shell
# 例1
$ fkill 24832 firefox :8080
# 例2
$ fkill 24832 24831 firefox safari :8080 :6060
```
如果指定的進程不存在,則出現一個提示:是否強制執行?
```shell
$ fkill 24832 24831 firefox safari :8080 :6060
? Error killing process. Would you like to use the force? (Y/n)
```
輸入 n 會終止執行,輸入 Y 會強制執行,但會有報錯,如:
```shell
AggregateError:
Error: Killing process 24832 failed: Process doesn't exist
at Array.map (<anonymous>)
at fkill (file:///usr/local/lib/node_modules/fkill-cli/node_modules/fkill/index.js:149:9)
```
如果不想看到報錯信息,則加上` -s `靜默執行就可以了。
如:
```shell
$ fkill -fs 24832 24831 firefox safari :8080 :6060
```
<a name="BXgqA"></a>
## 5. 如何搭配 procs 一起使用?
查看進程信息用 `procs` 命令更加專業,畢竟術業有專攻,用 procs 看,用 fkill 殺,這樣搭配使用更好。
比如,先查看 firefox 的進程信息,拿到 PID:
```shell
# 先查看進程信息
$ procs firefox
PID:▲ User │ TTY CPU MEM CPU Time │ Command
│ [%] [%] │
36131 bxp │ 0.0 1.1 00:00:18 │ /Applications/Firefox.app/Contents/MacOS/firefox
```
再強制終止進程:
```shell
# 加上 -f 就是強制終止了
$ fkill -f 36131
```
<a name="LcGwv"></a>
# 總結
一圖勝千言:

`fkill` 以非常直觀和人性化的操作方式提供絕殺能力,可以便捷的殺進程、關端口、殺應用,還可以同時做這些,一鍵操作,方便至極。
<a name="Hi26V"></a>