pidof 我們知道每個小孩一齣生就會一個全國唯一的編號來對其進行標識,用於以後上學,辦社保等,就是我們的身份證號。那麼在Linux系統中,用來管理運行程式的標識叫做PID,就是大家熟知的進程ID。那麼如何來找到程式的PID了,那麼就需要用到命令 pidof ,其功能主要 ...
pidof
我們知道每個小孩一齣生就會一個全國唯一的編號來對其進行標識,用於以後上學,辦社保等,就是我們的身份證號。那麼在Linux系統中,用來管理運行程式的標識叫做PID,就是大家熟知的進程ID。那麼如何來找到程式的PID了,那麼就需要用到命令pidof,其功能主要用來查看運行程式的PID。
基本用法
pidof [選項] [程式名]
其常用選項參數如下所示:
選項 | 說明 |
---|---|
-s | 僅返回一個PID |
-c | 僅返回具有相同root目錄的PID |
-x | 顯示由腳本開啟的進程 |
-o omitpid | 忽略指定的PID |
pidof命令的返回值通常只有兩個:
- 0:pidof命令至少找到一個對應的PID
- 1:pidof沒有找到任何匹配的PID
用法示例
1、顯示運行程式的PID
[root@localhost ~]# pidof sshd
34128 34059 28835 28820 24697 24627 23228 23215 1995
在顯示的結果可以看到共有9個PID,則說明伺服器上9個進程均是由sshd啟動的。
2、顯示Shell的進程
[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中刪除文件時,會出現被占用而暫時無法刪除的情況,這個我們會一款非常好用的軟體Unlocker,那麼在Linux中類似的情況如何處理了?今天我們來學習lsof命令。
lsof全稱list open files。用於查看進程打開的文件、目錄和套接字等信息。
基本用法
pidof [選項] [文件名]
其常用選項參數如下所示:
選項 | 說明 |
---|---|
-?或-h | 顯示幫助信息 |
-a | 顯示打開文件存在的進程 |
-c 進程名 | 顯示指定進程所打開的文件 |
-d FD | 顯示文件描述符(FD)占用的進程 |
+d 目錄名 | 顯示當前目錄下被打開的文件 |
+D 目錄名 | 遞歸顯示當前目錄下被打開的文件 |
-i 條件 | 顯示符合條件的進程 |
-p pid | 顯示指定PID打開的文件 |
-u uid | 顯示指定UID打開的文件 |
-g | 顯示所屬組標識符PGID |
R | 顯示父進程PPID |
其中選項 -i 支持的條件如下所示:
條件 | 說明 | 示例 |
---|---|---|
4/6 | IPv4/ IPv6 | lsof -i |
protocol | UDP/TCP | lsof -i TCP |
hostname | 網路主機名 | lsof -i@localhost |
hostaddr | 網路地址 | lsof [email protected] |
service | 服務名稱,可查看/etc/services | lsof -i:ssh |
port | 埠 | lsof -i:22 |
lsof輸出的詳細信息解釋如下:
- COMMAND:進程名稱,如果名稱較長,則預設只顯示前9個字元
- PID:進程標識符,如果添加-R參數,則顯示父進程PPID
- USER:進程所有者,如果添加-g參數,則顯示組標識符PGID
- FD:文件描述符
- TYPE:文件類型,常見類型如下所示:
DIR:表示目錄
REG:表示普通文件
CHR:表示字元類型
BLK:表示塊設備類型
UNIX:表示UNIX套接字
FIFO:表示先進先出隊列
IPv4:表示IPv4套接字
IPv6:表示IPv6套接字
文件描述符FD,但卻可以表示兩類內容:
- 第一類是文件描述符
0:標準輸入
1:標準輸出
2:標準錯誤輸出
n:其他文件描述符的數值
- 第二類描述文件特征的標識
CWD:表示應用程式的當前工作目錄,即程式啟動的目錄
txt:表示文件類型為程式代碼或數據
mem:記憶體映射文件
pd:父目錄
rtd:根目錄
DEL:表示文件已經刪除但還存在於記憶體中
用法示例
1、通過文件定位占用的進程
[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、通過文件描述符定位進程
[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、通過進程定位文件
[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主要用於顯示進程正在使用的文件、套接字、掛載點等。
基本用法
fuser [選項] [文件名]
其常用選項如下所示:
選項 | 說明 |
---|---|
-a ,--all | 顯示命令行中指定的所有文件 |
-c | 同-m選項,用於相容POSIX |
-k, --kill | 殺掉使用文件的進程 |
-i, --interactive | 殺掉進程前需要用戶確認,如果無-k參數則預設忽略該參數 |
-l, --list-signals | 顯示所有已知的 signal名稱 |
-m NAME, --mount NAME | 指定一個掛載的文件系統或被掛載的設備 |
-n SPACE | 指定一個不同的命名空間,支持不同的命名空間文件(預設為文件名)、UDP(本地UDP埠)、TCP(本地TCP埠),為避免歧義,可以使用name/space形式,如80/tcp |
-w | 僅殺掉擁有寫入許可權的進程,如果無-k參數則預設忽略該參數 |
-s, --silent | 靜默模式,-u和-v忽略該參數 |
-u, --user | 在PID後顯示所屬的用戶名 |
-v, --verbose | 顯示詳細信息 |
-4, --ipv4 | 僅搜索IPv4的套接字 |
-6, --ipv6 | 僅搜索IPv6的套接字 |
fuser顯示指定文件或文件系統的進程PID,在預設模式中,每個文件名後面會用一個字母表示訪問類型,如下所示:
- c:表示當前目錄
- e:表示該文件為可執行文件
- f:表示被打開的文件,預設模式中f不顯示
- F:表示被打開的文件,用於寫入操作,預設模式中F不顯示
- r:根目錄
- m:映射文件或共用lib
-f 和 -F 只有與選項 -v 一起使用的時候才會顯示,其他情況則預設不顯示
用法示例
1、殺掉所有占用/home的進程
[root@localhost ~]# fuser -km /home
2、顯示本地所有mysql上埠進程
[root@localhost ~]# fuser mysql/tcp
mysql/tcp: 2680
3、顯示詳細的信息
[root@localhost ~]# fuser -v top.txt
用戶 進程號 許可權 命令
/root/top.txt: root 15847 F.... top
4、查看有多個進程正在使用某個目錄下文件系統,包含子目錄
[root@localhost ~]# fuser -v -m /home/data
用戶 進程號 許可權 命令
/home/data: root kernel mount /home/data
5、通過埠定位進程
[root@localhost ~]# fuser -v -n tcp 22
用戶 進程號 許可權 命令
22/tcp: root 27597 F.... sshd
root 31119 F.... sshd
或
[root@localhost ~]# fuser -v 22/tcp
用戶 進程號 許可權 命令
22/tcp: root 27597 F.... sshd
root 31119 F.... sshd
fuser與lsof對比
對比項 | fuser | lsof |
---|---|---|
定位方式 | 通過文件查找進程 | 通過進程查找文件 |
所屬標準 | POSIX | - |
參數類型 | 文件/網路埠 | 文件/PID/網路埠 |
進程輸出 | PID | PID詳細信息 |
是否可發送信息 | 可以,使用-k | 不可以 |
ps
在Windows系統中用於查看進程通常是通過任務管理器。而在Linux中,我們用ps(Process Status)命令來查看進程。
基本用法
ps [選項]
其常用選項如下所示:
選項 | 說明 |
---|---|
-A | 顯示所有進程,同選項-e |
-a | 顯示所有進程,但排除新會話的首進程和無控制終端的進程 |
-d | 顯示所有進程,但排除新會話的首進程 |
-e | 顯示所有進程,同選項-A |
r | 僅顯示正在運行的進程 |
-C cmdlist | 顯示指定命令的進程信息 |
-p pidlist | 顯示指定PID的進程 |
-t ttylist | 顯示指定tty的進程 |
-u userlist | 顯示指定有效用戶ID或名字的進程 |
-c | 顯示CLS和PRI列 |
-f | 添加詳細列信息,通常與其他選項聯合使用 |
-x | 沒有關聯到終端上的進程也進行顯示 |
-o | 僅顯示自定義的列 |
-l | 僅顯示屬於當前登錄用戶的PID與相關信息列表 |
--sort spec | 對輸出信息進行排序 + 升序排序 - 降序排序 |
用法示例
1、不帶參數的示例
[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、僅顯示與當前用戶相關的進程和相關信息
[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:表示進程標誌,說明當前進程的許可權,若為4表示進程許可權為root,若為1表示些子進程僅可進行複製(fork)而無法實際運行
- S:表示進程狀態,主要狀態有:
R:進程正在運行
S:進程處於睡眠狀態,但可以被喚醒
D:進程處於不可被喚醒的睡眠狀態,通常該進程可能在等待I/O
T:停止狀態,可能是在工作控制或除錯狀態
Z:僵屍狀態,進行已經終止但卻無法釋放記憶體等 - UID/PID/PPID:進行的所屬UID/PID/PPID
- C:CPU使用率,單位為%
- PRI/NI:Priority/Nice縮寫,表示進程被CPU執行的優先順序,數值越小越快被CPU執行
- ADDR:與記憶體相關,ADDR表示該進程在記憶體的哪個部分,如果是Running進程,會顯示 -
- SZ:與記憶體相關,表示該進程使用了多少記憶體;
- WCHAN:與記憶體相關,表示該進程目前是否正在運行,-表示正在運行中
- TTY:啟動進程的終端名稱
- TIME:進程的實際CPU占用時間之和,單位為秒
- CMD:進程命令
3、查看系統所有進程
[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:進程所屬用戶
- PID:進程標識符
- %CPU:進程的CPU占比
- %MEM:進程物理記憶體占比
- VSZ:進程虛擬記憶體(KB)使用量
- RSS:進程占用的固定記憶體量(KB)
- TTY:啟動進程的終端名稱
- STAT:進程狀態
- START:進程啟動時間
- TIME:進程的實際CPU占用時間之和
- COMMAND:進程命令
在Linux中ps通常有三種不同的書寫格式
- BSD格式:選項前不加短橫線 - ,多個選項可以組合使用如ps aux
- UNIX格式:選項前加短橫線 -,多個選項可以組合使用如ps -aux
- GNU長格式:選項前加雙短橫線 --,如 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、對輸出結果進行排序
[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查看進程十分方便,但若想查看詳細進程和子進程時,則需要使用pstree全命令。由於pstree不是系統自帶,需要自行安裝
yum -y install pstree
基本語法
pstree [選項]
常用選項如下所示:
選項 | 說明 |
---|---|
-a | 顯示每個進程的完整指令,包括路徑、參數等 |
-h | 高亮顯示當前進程及父進程 |
-g | 顯示PGID |
-n | 相同父進程下,按各自的PID進行排序 |
-p | 顯示PID |
-s | 顯示父進程 |
-u username | 顯示UID信息 |
kill
在Windows系統中,當某個一個程式出現假死或無反應時,我們常常打開任務管理器,找到對應的進程,然後殺掉該進程。在命令行盛行的Linux中,我們該使用哪個命令?常用於殺掉進程的命令非kill莫屬了。
基本用法
kill [選項] [PID]
其常用選項如下所示:
選項 | 說明 |
---|---|
-s signal | 向目標進程發送指定的信號類型,信號可以為名稱或數字 |
-l | 顯示信號名稱列表,如果在-l加編號則查看信號名稱,反之亦然 |
-a | 處理當前進程時,不限制命令和PID的對應關係 |
-p | 指定kill命令僅顯示相關進程的進程號,而不發送任何信號 |
- 無選項:表示向目標進程發送預設的終止信號,即SIGTERM
- PID>0:表示向目標進程發送信號,此處的PID可以是多個PID,用空格進行分隔
- PID=0:表示向當前進程組的所有進程發送信號
- PID=-1:表示向除當前 kill 進程和 init 進程之外的所有進程發送信號
- PID<-1:表示向進程組PGID的所有進程發送信號,如-123,則向進程組PGID為123的所有進程發送信號
用法示例
1、顯示信號列表
除以上顯示信號,還有一個特殊的編號0為測試信號,其作用如下:
- 用於測試目標進程是否存在
[root@localhost ~]# kill -l 0
T
[root@localhost ~]# kill -0 99999
bash: kill: (99999) - 沒有那個進程
- 用於測試當前用戶是否擁有向該進程發送信號的許可權
[admin@localhost ~]# kill -0 2325
bash: kill: (2325) - 操作不被允許
2、查看信號對應的編號或名稱
[root@localhost ~]# kill -l SIGHUP
1
[root@localhost ~]# kill -l KILL
9
[root@localhost ~]# kill -l 9
KILL
在Linux中常用信號如下所示:
信號名稱 | 編號 | 解釋 |
---|---|---|
HUP | 1 | 終端斷線 |
INT | 2 | 中斷(同Ctrl+C) |
QUIT | 3 | 退出(同Ctrl+) |
KILL | 9 | 強制終止 |
TEEM | 15 | 終止 |
CONT | 18 | 繼續(與STOP相反) |
STOP | 19 | 暫停(同Ctrl+Z) |
3、強制終止進程
[root@localhost ~]# kill -9 26744
[root@localhost ~]# kill -kill 30470
在使用kill -9需要註意的事項如下所示:
- kill不能殺死進程為1的init進程
- 在使用kill -9時是強行終止進程且沒有通知目標進程進行自我清理,而是突然被中止,可以造成資源無法正常釋放,數據無法同步到磁碟等,在使用前需要三思
本文同步在微信訂閱號上發佈,如各位小伙伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下麵的二維碼添加關註: