pidof
? ? 我們知道每個(gè)小孩一出生就會(huì)一個(gè)全國(guó)唯一的編號(hào)來(lái)對(duì)其進(jìn)行標(biāo)識(shí),用于以后上學(xué),辦社保等,就是我們的身份證號(hào)。那么在Linux系統(tǒng)中,用來(lái)管理運(yùn)行程序的標(biāo)識(shí)叫做PID,就是大家熟知的進(jìn)程ID。那么如何來(lái)找到程序的PID了,那么就需要用到命令pidof,其功能主要用來(lái)查看運(yùn)行程序的PID。
基本用法
pidof [選項(xiàng)] [程序名]
其常用選項(xiàng)參數(shù)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -s | 僅返回一個(gè)PID |
| -c | 僅返回具有相同root目錄的PID |
| -x | 顯示由腳本開啟的進(jìn)程 |
| -o omitpid | 忽略指定的PID |
pidof命令的返回值通常只有兩個(gè):
- 0:pidof命令至少找到一個(gè)對(duì)應(yīng)的PID
- 1:pidof沒有找到任何匹配的PID
用法示例
1、顯示運(yùn)行程序的PID
[root@localhost ~]# pidof sshd
34128 34059 28835 28820 24697 24627 23228 23215 1995
在顯示的結(jié)果可以看到共有9個(gè)PID,則說(shuō)明服務(wù)器上9個(gè)進(jìn)程均是由sshd啟動(dòng)的。
2、顯示Shell的進(jìn)程
[root@localhost ~]# cat test.sh
#!/bin/bash
i=1;
while [ $i -le 10000 ]
do
echo $i
i=$((i+1))
sleep 120s
done
[root@localhost ~]# ./test.sh &
[root@localhost ~]# pidof -x test.sh
36554
3、顯示指定程序的PID
[root@localhost ~]# pidof -s sshd
7524
4、忽略指定的PID
[root@localhost ~]# pidof sshd
9104 9103 7524 7434 4474 4462 1995
[root@localhost ~]# pidof sshd -o 1995
11979 11978 7524 7434 4474 4462
lsof
? ? 在Windows中刪除文件時(shí),會(huì)出現(xiàn)被占用而暫時(shí)無(wú)法刪除的情況,這個(gè)我們會(huì)一款非常好用的軟件Unlocker,那么在Linux中類似的情況如何處理了?今天我們來(lái)學(xué)習(xí)lsof命令。
? ? lsof全稱list open files。用于查看進(jìn)程打開的文件、目錄和套接字等信息。
基本用法
lsof [選項(xiàng)] [文件名]
其常用選項(xiàng)參數(shù)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -?或-h | 顯示幫助信息 |
| -a | 顯示打開文件存在的進(jìn)程 |
| -c 進(jìn)程名 | 顯示指定進(jìn)程所打開的文件 |
| -d FD | 顯示文件描述符(FD)占用的進(jìn)程 |
| +d 目錄名 | 顯示當(dāng)前目錄下被打開的文件 |
| +D 目錄名 | 遞歸顯示當(dāng)前目錄下被打開的文件 |
| -i 條件 | 顯示符合條件的進(jìn)程 |
| -p pid | 顯示指定PID打開的文件 |
| -u uid | 顯示指定UID打開的文件 |
| -g | 顯示所屬組標(biāo)識(shí)符PGID |
| R | 顯示父進(jìn)程PPID |
其中選項(xiàng) -i 支持的條件如下所示:
| 條件 | 說(shuō)明 | 示例 |
|---|---|---|
| 4/6 | IPv4/ IPv6 | lsof -i |
| protocol | UDP/TCP | lsof -i TCP |
| hostname | 網(wǎng)絡(luò)主機(jī)名 | lsof -i@localhost |
| hostaddr | 網(wǎng)絡(luò)地址 | lsof -i@192.168.8.8 |
| service | 服務(wù)名稱,可查看/etc/services | lsof -i:ssh |
| port | 端口 | lsof -i:22 |
lsof輸出的詳細(xì)信息解釋如下:
- COMMAND:進(jìn)程名稱,如果名稱較長(zhǎng),則默認(rèn)只顯示前9個(gè)字符
- PID:進(jìn)程標(biāo)識(shí)符,如果添加-R參數(shù),則顯示父進(jìn)程PPID
- USER:進(jìn)程所有者,如果添加-g參數(shù),則顯示組標(biāo)識(shí)符PGID
- FD:文件描述符
- TYPE:文件類型,常見類型如下所示:
DIR:表示目錄
REG:表示普通文件
CHR:表示字符類型
BLK:表示塊設(shè)備類型
UNIX:表示UNIX套接字
FIFO:表示先進(jìn)先出隊(duì)列
IPv4:表示IPv4套接字
IPv6:表示IPv6套接字
文件描述符FD,但卻可以表示兩類內(nèi)容:
- 第一類是文件描述符
0:標(biāo)準(zhǔn)輸入
1:標(biāo)準(zhǔn)輸出
2:標(biāo)準(zhǔn)錯(cuò)誤輸出
n:其他文件描述符的數(shù)值

- 第二類描述文件特征的標(biāo)識(shí)
CWD:表示應(yīng)用程序的當(dāng)前工作目錄,即程序啟動(dòng)的目錄
txt:表示文件類型為程序代碼或數(shù)據(jù)
mem:內(nèi)存映射文件
pd:父目錄
rtd:根目錄
DEL:表示文件已經(jīng)刪除但還存在于內(nèi)存中
用法示例
1、通過(guò)文件定位占用的進(jìn)程
[root@localhost ~]# top -d 2 > top.txt
[root@localhost ~]# lsof top.txt
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
top 8900 root 1w REG 8,2 69035 469790741 top.txt
2、通過(guò)文件描述符定位進(jìn)程
[root@localhost ~]# lsof -d 5 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 5u a_inode 0,10 0 7450 [signalfd]
Xvnc 2678 root 5u IPv6 41776 0t0 TCP *:6003 (LISTEN)
3、通過(guò)進(jìn)程定位文件
[root@localhost ~]# ps -ef |grep -i mysql | grep -v grep
mysql 2680 1 2 7月19 ? 11:44:50 /usr/libexec/mysqld --basedir=/usr
[root@localhost ~]# lsof -p 2680 | head -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 2680 mysql cwd DIR 8,2 4096 319571 /var/lib/mysql
mysqld 2680 mysql rtd DIR 8,2 254 512 /
4、查看用戶打開的文件
[root@localhost ~]# lsof -u root | tail -3
lsof:WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kworker/3 39337 root cwd DIR 8,2 254 512 /
kworker/3 39337 root rtd DIR 8,2 254 512 /
kworker/3 39337 root txt unknown /proc/39337/exe
5、查看程序所占用的端口
[root@localhost ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 27597 root 3u IPv4 1460505039 0t0 TCP *:ssh (LISTEN)
sshd 27597 root 4u IPv6 1460505041 0t0 TCP *:ssh (LISTEN)
fuser
? ? fuser主要用于顯示進(jìn)程正在使用的文件、套接字、掛載點(diǎn)等。
基本用法
fuser [選項(xiàng)] [文件名]
其常用選項(xiàng)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -a ,--all | 顯示命令行中指定的所有文件 |
| -c | 同-m選項(xiàng),用于兼容POSIX |
| -k, --kill | 殺掉使用文件的進(jìn)程 |
| -i, --interactive | 殺掉進(jìn)程前需要用戶確認(rèn),如果無(wú)-k參數(shù)則默認(rèn)忽略該參數(shù) |
| -l, --list-signals | 顯示所有已知的 signal名稱 |
| -m NAME, --mount NAME | 指定一個(gè)掛載的文件系統(tǒng)或被掛載的設(shè)備 |
| -n SPACE | 指定一個(gè)不同的命名空間,支持不同的命名空間文件(默認(rèn)為文件名)、UDP(本地UDP端口)、TCP(本地TCP端口),為避免歧義,可以使用name/space形式,如80/tcp |
| -w | 僅殺掉擁有寫入權(quán)限的進(jìn)程,如果無(wú)-k參數(shù)則默認(rèn)忽略該參數(shù) |
| -s, --silent | 靜默模式,-u和-v忽略該參數(shù) |
| -u, --user | 在PID后顯示所屬的用戶名 |
| -v, --verbose | 顯示詳細(xì)信息 |
| -4, --ipv4 | 僅搜索IPv4的套接字 |
| -6, --ipv6 | 僅搜索IPv6的套接字 |
fuser顯示指定文件或文件系統(tǒng)的進(jìn)程PID,在默認(rèn)模式中,每個(gè)文件名后面會(huì)用一個(gè)字母表示訪問(wèn)類型,如下所示:
- c:表示當(dāng)前目錄
- e:表示該文件為可執(zhí)行文件
- f:表示被打開的文件,默認(rèn)模式中f不顯示
- F:表示被打開的文件,用于寫入操作,默認(rèn)模式中F不顯示
- r:根目錄
- m:映射文件或共享lib
-f 和 -F 只有與選項(xiàng) -v 一起使用的時(shí)候才會(huì)顯示,其他情況則默認(rèn)不顯示
用法示例
1、殺掉所有占用/home的進(jìn)程
[root@localhost ~]# fuser -km /home
2、顯示本地所有mysql上端口進(jìn)程
[root@localhost ~]# fuser mysql/tcp
mysql/tcp: 2680
3、顯示詳細(xì)的信息
[root@localhost ~]# fuser -v top.txt
用戶 進(jìn)程號(hào) 權(quán)限 命令
/root/top.txt: root 15847 F.... top
4、查看有多個(gè)進(jìn)程正在使用某個(gè)目錄下文件系統(tǒng),包含子目錄
[root@localhost ~]# fuser -v -m /home/data
用戶 進(jìn)程號(hào) 權(quán)限 命令
/home/data: root kernel mount /home/data
5、通過(guò)端口定位進(jìn)程
[root@localhost ~]# fuser -v -n tcp 22
用戶 進(jìn)程號(hào) 權(quán)限 命令
22/tcp: root 27597 F.... sshd
root 31119 F.... sshd
或
[root@localhost ~]# fuser -v 22/tcp
用戶 進(jìn)程號(hào) 權(quán)限 命令
22/tcp: root 27597 F.... sshd
root 31119 F.... sshd
fuser與lsof對(duì)比
| 對(duì)比項(xiàng) | fuser | lsof |
|---|---|---|
| 定位方式 | 通過(guò)文件查找進(jìn)程 | 通過(guò)進(jìn)程查找文件 |
| 所屬標(biāo)準(zhǔn) | POSIX | - |
| 參數(shù)類型 | 文件/網(wǎng)絡(luò)端口 | 文件/PID/網(wǎng)絡(luò)端口 |
| 進(jìn)程輸出 | PID | PID詳細(xì)信息 |
| 是否可發(fā)送信息 | 可以,使用-k | 不可以 |
ps
? ? 在Windows系統(tǒng)中用于查看進(jìn)程通常是通過(guò)任務(wù)管理器。而在Linux中,我們用ps(Process Status)命令來(lái)查看進(jìn)程。
基本用法
ps [選項(xiàng)]
其常用選項(xiàng)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -A | 顯示所有進(jìn)程,同選項(xiàng)-e |
| -a | 顯示所有進(jìn)程,但排除新會(huì)話的首進(jìn)程和無(wú)控制終端的進(jìn)程 |
| -d | 顯示所有進(jìn)程,但排除新會(huì)話的首進(jìn)程 |
| -e | 顯示所有進(jìn)程,同選項(xiàng)-A |
| r | 僅顯示正在運(yùn)行的進(jìn)程 |
| -C cmdlist | 顯示指定命令的進(jìn)程信息 |
| -p pidlist | 顯示指定PID的進(jìn)程 |
| -t ttylist | 顯示指定tty的進(jìn)程 |
| -u userlist | 顯示指定有效用戶ID或名字的進(jìn)程 |
| -c | 顯示CLS和PRI列 |
| -f | 添加詳細(xì)列信息,通常與其他選項(xiàng)聯(lián)合使用 |
| -x | 沒有關(guān)聯(lián)到終端上的進(jìn)程也進(jìn)行顯示 |
| -o | 僅顯示自定義的列 |
| -l | 僅顯示屬于當(dāng)前登錄用戶的PID與相關(guān)信息列表 |
| --sort spec | 對(duì)輸出信息進(jìn)行排序 + 升序排序 - 降序排序 |
用法示例
1、不帶參數(shù)的示例
[root@localhost ~]# ps
PID TTY TIME CMD
11047 pts/0 00:00:00 ps
24892 pts/0 00:00:00 su
25142 pts/0 00:00:00 bash
2、僅顯示與當(dāng)前用戶相關(guān)的進(jìn)程和相關(guān)信息
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 R 0 22720 25142 0 80 0 - 38292 - pts/0 00:00:00 ps
4 S 0 24892 22641 0 80 0 - 58599 do_wai pts/0 00:00:00 su
4 S 0 25142 24892 0 80 0 - 29305 do_wai pts/0 00:00:00 bash
- F:表示進(jìn)程標(biāo)志,說(shuō)明當(dāng)前進(jìn)程的權(quán)限,若為4表示進(jìn)程權(quán)限為root,若為1表示些子進(jìn)程僅可進(jìn)行復(fù)制(fork)而無(wú)法實(shí)際運(yùn)行
- S:表示進(jìn)程狀態(tài),主要狀態(tài)有:
? R:進(jìn)程正在運(yùn)行
? S:進(jìn)程處于睡眠狀態(tài),但可以被喚醒
? D:進(jìn)程處于不可被喚醒的睡眠狀態(tài),通常該進(jìn)程可能在等待I/O
? T:停止?fàn)顟B(tài),可能是在工作控制或除錯(cuò)狀態(tài)
? Z:僵尸狀態(tài),進(jìn)行已經(jīng)終止但卻無(wú)法釋放內(nèi)存等 - UID/PID/PPID:進(jìn)行的所屬UID/PID/PPID
- C:CPU使用率,單位為%
- PRI/NI:Priority/Nice縮寫,表示進(jìn)程被CPU執(zhí)行的優(yōu)先級(jí),數(shù)值越小越快被CPU執(zhí)行
- ADDR:與內(nèi)存相關(guān),ADDR表示該進(jìn)程在內(nèi)存的哪個(gè)部分,如果是Running進(jìn)程,會(huì)顯示 -
- SZ:與內(nèi)存相關(guān),表示該進(jìn)程使用了多少內(nèi)存;
- WCHAN:與內(nèi)存相關(guān),表示該進(jìn)程目前是否正在運(yùn)行,-表示正在運(yùn)行中
- TTY:?jiǎn)?dòng)進(jìn)程的終端名稱
- TIME:進(jìn)程的實(shí)際CPU占用時(shí)間之和,單位為秒
- CMD:進(jìn)程命令
3、查看系統(tǒng)所有進(jìn)程
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 8月08 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 8月08 0:03 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 8月08 0:00 [kworker/0:0H]
root 8 0.0 0.0 0 0 ? S 8月08 0:00 [migration/0]
- USER:進(jìn)程所屬用戶
- PID:進(jìn)程標(biāo)識(shí)符
- %CPU:進(jìn)程的CPU占比
- %MEM:進(jìn)程物理內(nèi)存占比
- VSZ:進(jìn)程虛擬內(nèi)存(KB)使用量
- RSS:進(jìn)程占用的固定內(nèi)存量(KB)
- TTY:啟動(dòng)進(jìn)程的終端名稱
- STAT:進(jìn)程狀態(tài)
- START:進(jìn)程啟動(dòng)時(shí)間
- TIME:進(jìn)程的實(shí)際CPU占用時(shí)間之和
- COMMAND:進(jìn)程命令
在Linux中ps通常有三種不同的書寫格式
- BSD格式:選項(xiàng)前不加短橫線 - ,多個(gè)選項(xiàng)可以組合使用如ps aux
- UNIX格式:選項(xiàng)前加短橫線 -,多個(gè)選項(xiàng)可以組合使用如ps -aux
- GNU長(zhǎng)格式:選項(xiàng)前加雙短橫線 --,如 ps --context
因此ps aux 和ps -aux 在顯示的輸出信息是一樣的。
4、顯示自定義列
[root@localhost ~]# ps -eo pid,user,cmd
PID USER CMD
2 root [kthreadd]
3 root [ksoftirqd/0]
5 root [kworker/0:0H]
8 root [migration/0]
5、對(duì)輸出結(jié)果進(jìn)行排序
[root@localhost ~]# ps -ef --sort=uid,-ppid,+pid
UID PID PPID C STIME TTY TIME CMD
root 31637 31624 0 17:42 pts/1 00:00:00 less -s
root 40772 25142 0 17:44 pts/0 00:00:00 ps -ef --sort=uid,-ppid,+pid
root 40773 25142 0 17:44 pts/0 00:00:00 more
root 25142 24892 0 15:32 pts/0 00:00:00 bash
root 31624 24164 0 17:42 pts/1 00:00:00 man ps
root 24164 23955 0 15:32 pts/1 00:00:00 bash
root 23955 23586 0 15:32 pts/1 00:00:00 su root
root 24892 22641 0 15:32 pts/0 00:00:00 su root
pstree
? ? 在使用ps查看進(jìn)程十分方便,但若想查看詳細(xì)進(jìn)程和子進(jìn)程時(shí),則需要使用pstree全命令。由于pstree不是系統(tǒng)自帶,需要自行安裝
yum -y install pstree
基本語(yǔ)法
pstree [選項(xiàng)]
常用選項(xiàng)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -a | 顯示每個(gè)進(jìn)程的完整指令,包括路徑、參數(shù)等 |
| -h | 高亮顯示當(dāng)前進(jìn)程及父進(jìn)程 |
| -g | 顯示PGID |
| -n | 相同父進(jìn)程下,按各自的PID進(jìn)行排序 |
| -p | 顯示PID |
| -s | 顯示父進(jìn)程 |
| -u username | 顯示UID信息 |
kill
? ? 在Windows系統(tǒng)中,當(dāng)某個(gè)一個(gè)程序出現(xiàn)假死或無(wú)反應(yīng)時(shí),我們常常打開任務(wù)管理器,找到對(duì)應(yīng)的進(jìn)程,然后殺掉該進(jìn)程。在命令行盛行的Linux中,我們?cè)撌褂媚膫€(gè)命令?常用于殺掉進(jìn)程的命令非kill莫屬了。
基本用法
kill [選項(xiàng)] [PID]
其常用選項(xiàng)如下所示:
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -s signal | 向目標(biāo)進(jìn)程發(fā)送指定的信號(hào)類型,信號(hào)可以為名稱或數(shù)字 |
| -l | 顯示信號(hào)名稱列表,如果在-l加編號(hào)則查看信號(hào)名稱,反之亦然 |
| -a | 處理當(dāng)前進(jìn)程時(shí),不限制命令和PID的對(duì)應(yīng)關(guān)系 |
| -p | 指定kill命令僅顯示相關(guān)進(jìn)程的進(jìn)程號(hào),而不發(fā)送任何信號(hào) |
- 無(wú)選項(xiàng):表示向目標(biāo)進(jìn)程發(fā)送默認(rèn)的終止信號(hào),即SIGTERM
- PID>0:表示向目標(biāo)進(jìn)程發(fā)送信號(hào),此處的PID可以是多個(gè)PID,用空格進(jìn)行分隔
- PID=0:表示向當(dāng)前進(jìn)程組的所有進(jìn)程發(fā)送信號(hào)
- PID=-1:表示向除當(dāng)前 kill 進(jìn)程和 init 進(jìn)程之外的所有進(jìn)程發(fā)送信號(hào)
- PID<-1:表示向進(jìn)程組PGID的所有進(jìn)程發(fā)送信號(hào),如-123,則向進(jìn)程組PGID為123的所有進(jìn)程發(fā)送信號(hào)
用法示例
1、顯示信號(hào)列表

除以上顯示信號(hào),還有一個(gè)特殊的編號(hào)0為測(cè)試信號(hào),其作用如下:
- 用于測(cè)試目標(biāo)進(jìn)程是否存在
[root@localhost ~]# kill -l 0
T
[root@localhost ~]# kill -0 99999
bash: kill: (99999) - 沒有那個(gè)進(jìn)程
- 用于測(cè)試當(dāng)前用戶是否擁有向該進(jìn)程發(fā)送信號(hào)的權(quán)限
[admin@localhost ~]# kill -0 2325
bash: kill: (2325) - 操作不被允許
2、查看信號(hào)對(duì)應(yīng)的編號(hào)或名稱
[root@localhost ~]# kill -l SIGHUP
1
[root@localhost ~]# kill -l KILL
9
[root@localhost ~]# kill -l 9
KILL
在Linux中常用信號(hào)如下所示:
| 信號(hào)名稱 | 編號(hào) | 解釋 |
|---|---|---|
| HUP | 1 | 終端斷線 |
| INT | 2 | 中斷(同Ctrl+C) |
| QUIT | 3 | 退出(同Ctrl+\) |
| KILL | 9 | 強(qiáng)制終止 |
| TEEM | 15 | 終止 |
| CONT | 18 | 繼續(xù)(與STOP相反) |
| STOP | 19 | 暫停(同Ctrl+Z) |
3、強(qiáng)制終止進(jìn)程
[root@localhost ~]# kill -9 26744
[root@localhost ~]# kill -kill 30470
在使用kill -9需要注意的事項(xiàng)如下所示:
- kill不能殺死進(jìn)程為1的init進(jìn)程
- 在使用kill -9時(shí)是強(qiáng)行終止進(jìn)程且沒有通知目標(biāo)進(jìn)程進(jìn)行自我清理,而是突然被中止,可以造成資源無(wú)法正常釋放,數(shù)據(jù)無(wú)法同步到磁盤等,在使用前需要三思