Linux 基礎教程 37-進程命令

来源:https://www.cnblogs.com/surpassme/archive/2018/08/16/9484794.html
-Advertisement-
Play Games

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:其他文件描述符的數值

01文件描述符.jpg

  • 第二類描述文件特征的標識
    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、顯示信號列表
02信號列表.jpg

除以上顯示信號,還有一個特殊的編號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,或掃描下麵的二維碼添加關註:
MyQRCode.jpg


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 做項目時偶爾B類賦值給A類,碰巧A和B類型很多屬性欄位名是一樣的,或者只是大小寫不一樣,這是可以利用泛型,反射來寫一個自動化賦值的方法。 下麵方法不考慮大小寫不一樣的情況,如果要考慮,可以使用字元串方法 ToUpper() 、ToLower() 後,對比欄位名是否一樣。 值得註意的地方,屬性到底有沒 ...
  • 前言 今年是2018年,發現已經有4年沒有寫博客了,在這4年的時光里,接觸了很多的.NET技術,自己的技術也得到很大的進步。在這段時光裡面很感謝張隊長以及其他開發者一直對.NET Core開源社區做出的巨大貢獻,我也在其中學習到很多的知識,因此在這段時間我也開始記錄我的學習成果,供大家好好學習,以及 ...
  • 生成代理類步驟: 一:找到Visual Studio 的工具文件夾 二:用管理員方式打開本機工具命令提示 三:輸入要執行的腳本 wsdl /language:C# /n:xxxx.HermesMobileWebService /out:C:\BaServiceClient.cs http://hb- ...
  • 好吧,我又回來了,其實一直都想寫一篇關於EF core 的文章去記錄自己在開發時候遇到的問題。 EF core 就是字面上的意思咯,EF 就是.Net上用的很多的ORM框架,core呢,就是在.Net core 上使用的EF咯。 為什麼要使用EF框架呢,因為原始的ADO.NET需要編寫大量的數據訪問 ...
  • 插入排序,是迴圈遍歷一個無序數組(例如有10個元素),把遍歷出來的數值(第i個元素)插入到已經排過順序的數組(這個有序數組有10-i個元素)中。 用一個 數組 舉個例子: 初始數組:1, 89, 4, 34, 56, 40, 59, 60, 39, 1, 40, 90, 48 第一次迴圈(i=0): ...
  • 最近公司需要在伺服器上實現兩個音頻的合成及效果處理。 哇,乍一聽功能很簡單吧,就是將兩個音頻疊加,隨便一個媒體處理軟體幾秒鐘即可完成,但這僅僅只是針對單用戶而言而已。其次,本來這種服務原本就不應該在伺服器上面實現,為何? 流媒體處理是相當耗費伺服器資源的,包括IO,CPU,bandwidth等等。 ...
  • [TOC] 背景敘述 在前面幾篇 MEF 插件式開發 系列博客中,我分別在 和 兩種框架下實驗了 MEF 的簡單實驗,由於 由來已久,因此基於該框架下衍生出的很多優秀的 MEF 框架較多。但是對於 來說,情況有所不同,由於它本身對 DI 內置並提供支持,因此我嘗試使用它的全新 依賴註入(DI) 來做 ...
  • CentOS 7 建議在一個純凈的 centos7上進行下麵的安裝部署$ setenforce 0 # 臨時關閉,重啟後失效$ systemctl stop firewalld.service # 臨時關閉,重啟後失效# 修改字元集,否則可能報 input/output error的問題,因為日誌里 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...