關於Linux進程管理,你該瞭解這些

一、什麼是程序和進程?

  程序:一組計算機能識別和執行的指令集合,可以按照既定的邏輯控制計算機運行來完成特定的功能。
  進程正在運行的程序,是操作系統進行資源分配和調度的基本單位,每個進程都有獨立的地址空間,並且佔用一定的系統資源。

區別和關係:
   程序是靜態的,它只是一組指令的集合,而進程是程序運行的動態過程。
   進程和程序並不是一一對應的關係,同一個程序運行在不同的數據集上就是不同的進程。
   程序是封閉的,而進程具有併發性和交往性。

二、什麼是線程?

  線程:操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。

線程與進程的關係:
   一個進程可以擁有多個線程,而一個線程同時只能被一個進程所擁有。
   線程不能單獨執行,但每一個線程都有程序入口、執行序列以及程序出口,它必須組成進程才能被執行。

三、進程的生命週期

在這裏插入圖片描述
  父進程調用fork()系統調用得到一個新的(子)進程描述且分配一個唯一的進程ID(PID),並複製該值到父進程描述的子進程中,父子進程共享相同的地址空間,此時父進程將被堵塞,直到子進程退出或執行exec()系統調用纔會繼續運行。
  exec()系統調用複製新的程序到子進程的地址空間,因爲與父進程共享地址空間,會產生一個分頁錯誤,系統會爲子進程分配新的物理內存。
  當程序執行完成後,子進程會調用exit()系統調用,釋放進程大部分的數據併發送一個信號通知其父進程。此時子進程就變爲一個殭屍進程(zombie)。
  當父進程接受到了子進程的終止信號,它會釋放子進程的所有的資源。

四、進程啓動方式

1、手動啓動

  手工啓動進程指的是由用戶輸入命令直接啓動一個進程,根據所啓動的進程類型和性質的不同,又可以細分爲前臺啓動和後臺啓動 2 種方式。
  Ⅰ、前臺啓動
  手工啓動一個進程的最常用的方式,在 Shell 提示處輸入命令後,創建一個子進程並運行命令,Shell 等待命令退出,然後返回到對用戶給出提示符。這條命令與 Shell 同步運行,即在前臺運行,用戶在它完成之前不能執行別的命令。
  Ⅱ、後臺啓動
  在 Shell 提示處輸入命令時,在其後加一個" &"(&前面有空格),創建一個子進程並運行命令,但不等待命令退出,而直接返回到對用戶給出提示符。這條命令與 Shell 異步運行,即在後臺運行。進程直接從後臺運行,用的相對較少,除非該進程非常耗時,且用戶也不急着需要其運行結果的時候,且後臺進程必須是非交互式的。

2、調度啓動(定時任務)

  在 Linux 系統中,任務可以被配置在指定的時間、日期或者系統平均負載量低於指定值時自動啓動,執行結果會通過郵件發給用戶。這裏需要使用到 at 命令crontab 命令

(1)、at 命令

  • 命令解釋

  at, batch, atq, atrm - queue, examine or delete jobs for later execution(排隊、檢查或刪除作業以供以後執行)
  如果某項工作在特定的時間執行一次,就可以使用 at 命令。

  可以看到上面的 at 說明中還有其他相關命令,其中:

命 令 解 釋
atq 列出用戶的計劃任務,如果是超級管理員則會列出所有用戶的計劃任務
atrm 根據工作號刪除 at 的定時任務
batch 在系統空閒的情況下執行 at 定時任務

  at 命令在使用之前需要安裝,並開啓獨立的 atd 服務。

[root@localhost ~]# yum install at    //安裝at命令
[root@localhost ~]# service atd start    //啓動atd服務
Starting atd:                                              [  OK  ]

  • 命令語法
      at [選項] 時間
  • 命令常用選項
選 項 作 用
-m 當 at 工作完成後,無論命令是否輸出,都用 E-mail 通知執行 at 命令的用戶
-d 刪除某個工作,同 atrm 命令的作用相同
-l 列出當前所有等待運行的工作,和 atq 命令的作用相同
-f 文件 讀取腳本文件
-c 工作號 根據工作號顯示 at 工作的實際內容
  • 時間參數的格式
格 式 解 釋
 HH:MM  24小時制,例如:13:14
 Midnight  表示 00:00
 Noon  表示 12:00
 Teatime  表示 16:00
MMDDYY
MM/DD/YY
MM-DD-YY
MM.DD.YY
例如:021520,表示2020年2月15日
 now + 時間  相對時間,時間單位可選:minutes、hours、days 和 weeks ,例如:now + 5 minutes,表示5分鐘後執行
  • 實例

  ① 三天後重啓網絡;

[root@localhost ~]# at now + 3 days
at> service network restart
job 1 at 2020-04-25 18:53    //使用Ctrl+d組合鍵保存

  ② 查看at的定時任務

[root@localhost ~]# atq    //兩個命令都可以
1       2020-04-25 18:53 a root
[root@localhost ~]# at -l
1       2020-04-25 18:53 a root

  ③ 查看at的定時任務的實際內容

[root@localhost ~]# at -c 1    //查看工作號爲1的任務實際內容
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
...省略部分內容
service network restart    //這裏就是啦
marcinDELIMITER53857a3a

  ④ 刪除at的定時任務

[root@localhost ~]# atrm 1
[root@localhost ~]# at -d 1    //兩個命令都可以
Cannot find jobid 1    //因爲上一個命令已經刪除工作號爲1的作業,所以找不到作業
[root@localhost ~]# atq

(2)、crontab 命令

  • 命令解釋

  crontab - maintain crontab files for individual users(爲單個用戶維護crontab文件)
  在前面所講到的 at 命令只能在特定時間執行一次任務,顯然在實際工作中是不夠的,這就需要 crontab 命令來重複執行定時任務。

  首先來了解一下 crond,它是Linux下用來週期性地執行某種任務或等待處理某些事件的一個守護進程,與Windows的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務工具,並且會自動啓動 crond 進程。crond 進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則會自動執行該任務。

  • 命令語法
      crontab [選項]
  • 命令常用選項
選 項 作 用
-u user 指定用戶,如果不指定,則表示當前用戶
-l 列出指定用戶的計劃任務列表
-e 編輯指定用戶的計劃任務列表
-r 刪除指定用戶的計劃任務列表
-i 交互模式,即給出確認提示
  • 編輯計劃任務(重點)

  使用 crontab -e 可以編輯用戶自己的計劃任務(一個空文件,格式需要自己編寫),如果定時任務需要系統執行,這是就需要編輯 /etc/crontab 這個配置文件。

[root@localhost ~]# cat /etc/crontab    #/etc/crontab 文件對計劃任務的格式有一定的提示信息,我們以它來初步瞭解計劃任務的語法格式
SHELL=/bin/bash    #標識使用的Shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin    #指定PATH環境變量
MAILTO=root    #如果命令結果或報錯有輸出,則會向root發送信息
HOME=/    #標識主目錄

# For details see man 4 crontabs    #以上內容是crontab的環境變量,用戶編寫自己的計劃任務時不需要寫的哦!

# Example of job definition:    #系統計劃任務的規則語法格式
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed    #在編寫系統定時任務時,一定要注意指明 user—name

  用戶自己的計劃任務的規則語法格式,與系統定時任務大同小異,也是以行爲單位,一行則爲一個計劃,但唯一的區別是不需要指定用戶名分 時 日 月 周 需要執行的命令

  下面我們對計劃任務的規則語法格式具體進行介紹;

  取值範圍:

時 間 範 圍
分 (一小時中的第幾分鐘) 0~59
時 (一天中的第幾時) 0~23
日 (一個月中的第幾日) 1~31
月 (一年中的第幾月) 1~12
周 (一個週中的星期幾) 0~7,0和7表示星期天

  四個符號:

符 號 含 義
* 表示取值範圍中的每一個數字
- 表示連續的時間範圍。在周的位置寫:1-7,表示週一到周天
, 表示間斷的時間範圍。在時的位置寫:1,4,7,表示1點、4點和7點
/ 代表每隔多久執行一次。在分的位置寫:*/10,表示每隔十分鐘
  • Crontab權限問題

  超級管理員可以通過配置 /etc/cron.allow (白名單) 和 /etc/cron.deny (黑名單) 兩個文件來限制某些用戶是否可以使用 crontab 命令,配置時在這兩個名單中每行寫一個用戶名,即可達到效果。
   當系統中有 /etc/cron.allow 文件時,只有寫入此文件的用戶可以使用 crontab 命令,沒有寫入的用戶不能使用 crontab 命令。
   當系統中只有 /etc/cron.deny 文件時,寫入此文件的用戶不能使用 crontab 命令,沒有寫入的用戶則可以使用 crontab 命令。
   白名單優先級高於黑名單,如果一個用戶同時存在兩個名單文件中,則可以使用 crontab 命令。

  • 實例

  ① 每小時的第5分鐘和第15分鐘向 /tmp/testfile 文件內寫入當前時間;

5,15 * * * * date >> /tmp/testfile

  ② 每天上午的8~12點的第5分鐘和第15分鐘重啓網絡

5,15 8-12 * * * service network restart

  ③ 每隔2天的上午的8-12點的第5分鐘和第15分鐘重啓系統

5,15 8-12 */2 * * reboot

  ④ 每星期一的晚上23:30重啓crond服務

30 23 * * 1 service crond restart

五、作業控制

1、什麼是作業和作業控制?

  一個正在執行的進程稱爲一個作業,而且作業可以包含一個或多個進程,尤其是當使用了管道和重定向命令。
  作業控制指的是控制正在運行的進程的行爲,比如:啓動、停止、強制終止、恢復以及異步運行作業的這些功能,讓shell可以在子進程運行期間返回接受其他命令。

  一般而言,進程與作業控制相關聯時,才被稱爲作業。

2、將作業放入後臺

  命令後面加上" &"(&前面有空格),可以把這個命令放到後臺執行

[root@localhost ~]# sleep 1m &
[1] 1850   //工作號(每個後臺命令都會分配) 進程號

   命令執行過裎中按 Ctrl+Z 組合鍵,命令會放到後臺並處於暫停狀態

[root@localhost ~]# sleep 1m
^Z
[1]+  Stopped                 sleep 1m

3、查看當前終端放入後臺的作業

  使用 jobs 命令可以查看當前終端放入後臺的工作,命令語法: jobs 命令 [&] ;

命令常用選項

選 項 作 用
-l 列出進程的 PID
-p 只列出進程的 PID
-r 只列出運行中的進程
-s 只列出已停止的進程
-n 只列出最近一次狀態改變的進程

實例

  查看放入後臺的作業;

[root@localhost ~]# jobs -l
[1]   1850 Done                    sleep 1m &
[2]-  1851 run                 	   sleep 2m
[3]+  1852 Stopped                 sleep 3m

  當前終端有三個後臺作業。其中,第一個字段爲工作號;"+/-" 代表最近 "第一個/第二個"放入後臺的作業;因爲使用 -l 選項,所以第三個字段列出了進程的 PID;第四個字段表示作業的狀態,Done、run、Stopped 和 terminated 分別表示 完成、運行中、暫停、終止狀態;最後一個字段爲啓動作業的命令。

4、將後臺暫停的作業恢復執行

  前面我們講到將作業放入後臺,使用 Ctrl+z 組合鍵時,作業進入後臺並且處於暫停狀態。有什麼辦法讓作業在後臺恢復執行嗎?

  答案是有的!這就需要用到 bg 命令命令語法: bg %工作號 ;

[root@localhost ~]# sleep 1m    //使用Ctrl+z鍵將作業放入後臺並暫停狀態
^Z
[1]+  Stopped                 sleep 1m
[root@localhost ~]# bg %1    //恢復執行狀態
[1]+ sleep 1m &
[root@localhost ~]# jobs    //查看狀態
[1]+  Running                 sleep 1m &

5、將後臺作業恢復前臺執行

  之前所講的都是講作業放到後臺執行,那麼有什麼辦法讓後臺作業恢復到前臺執行嗎?

  答案當然是有的!fg 命令就可以做到!命令語法: fg %工作號 ;

[root@localhost ~]# sleep 1m &    //後臺執行作業
[1] 2072
[root@localhost ~]# fg %1    //恢復前臺執行狀態
sleep 1m

6、殺死後臺作業

  很簡單,使用 kill %工作號 就可以!

[root@localhost ~]# sleep 1m &    //後臺執行作業
[1] 2073
[root@localhost ~]# kill %1    //殺死工作號爲1的作業
[root@localhost ~]# jobs    //終止狀態
[1]+  Terminated              sleep 1m

7、不掛斷地運行作業

  一般當我們斷開終端時,終端會收到SIGHUP信號從而關閉所有子進程。如果不希望某些進程被這個SIGHUP信號影響,就需要用到 nohup 命令。nohup 命令可以讓後臺作業在離開終端時,也能正確地在後臺執行。命令語法: nohup 命令 & ;

[root@localhost ~]# nohup ping www.baidu.com &
[1] 2413
[root@localhost ~]# nohup: 忽略輸入並把輸出追加到 `nohup.out'

tips: ① 無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。
   ② 如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
   ③ 如果沒有文件能創建或打開以用於追加,那麼 Command 參數指定的命令不可調用。

六、進程優先級

  在Linux系統中,表示進程優先級的有兩個數值:nice(NI)priority(PR)。其中,我們只能通過修改nice值(也叫靜態優先級)來調整進程優先級,因爲priority值是由內核動態調整的(也叫動態優先級),用戶是不能直接修改的。

  他們之間存在着這樣的關係:

PR(最終值)= PR (原始值) + NI
PR(最終值)數值越小,代表該進程的優先級越高,在同一個CPU調度週期中所佔的時間更長。

  所以說,nice值越小,進程的優先級就越高;反之,nice值越大,進程的優先級就越低。我們可以通過 renice 命令來調整一個進程的nice值。
  其中,我們需要注意的是:
    ① nice的取值範圍爲:fuhao-20~19,一共四十個級別;
    ② 普通用戶只能調整自己的進程,調整nice值的範圍爲 0~19,且不能降低nice值,即只能降低進程的優先級;
    ③ root用戶可以調整任何用戶的進程,並且在nice值的取值範圍內可以任意調整。

1、查看nice值

  ① 使用ps命令;

[root@localhost ~]# ps -le    //第八個字段即爲nice值
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 -  4840 poll_s ?        00:00:01 init
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0 -40   - -     0 migrat ?        00:00:00 migration/0
1 S     0      4      2  0  80   0 -     0 ksofti ?        00:00:00 ksoftirqd/0
1 S     0      5      2  0 -40   - -     0 cpu_st ?        00:00:00 stopper/0
...省略部分信息

  ② 使用top命令;

[root@localhost ~]# top    //第四個字段即爲nice值
top - 20:00:35 up  5:56,  1 user,  load average: 0.08, 0.03, 0.05
Tasks:  88 total,   1 running,  87 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.3%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004136k total,   235572k used,   768564k free,    47332k buffers
Swap:  2097148k total,        0k used,  2097148k free,    54556k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  2665 root      20   0 15024 1292  996 R  0.3  0.1   0:00.41 top
     1 root      20   0 19360 1524 1228 S  0.0  0.2   0:01.41 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
...省略部分信息

2、修改nice值

  可以通過 nice 命令renice 命令 對 nice 值進行調整。其中,nice命令可以對要啓動的程序賦予 nice 值,而 renice命令可以對進程的 nice 值進行修改。

  ① nice命令;

  命令語法: nice [-n nice值] 命令 ;

[root@localhost ~]# nice -n -5 /usr/local/httpd-2.4.41/bin/apachectl start    //啓動httpd服務並賦予nice值爲-5
[root@localhost ~]# ps -le | grep httpd    //可以看到所有的httpd進程nice值都爲-5
1 S     0   2117      1  0  75  -5 - 17593 poll_s ?        00:00:00 httpd
5 S     2   2118   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd
5 S     2   2119   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd
5 S     2   2120   2117  0  75  -5 - 103658 pipe_w ?       00:00:00 httpd

  ② renice命令;

  命令語法: renice [nice值] PID ;

[root@localhost ~]# /usr/local/httpd-2.4.41/bin/apachectl start    //啓動httpd服務
[root@localhost ~]# ps -le | grep httpd    //查看httpd服務的進程信息
1 S     0  21910      1  0  80   0 - 17593 poll_s ?        00:00:00 httpd
5 S     2  21911  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
5 S     2  21912  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
5 S     2  21913  21910  0  80   0 - 103658 pipe_w ?       00:00:00 httpd
[root@localhost ~]# renice -10 21913    //修改進程號爲21913的進程nice值爲-10
21913: old priority 0, new priority -10
[root@localhost ~]# ps -le | grep httpd | grep 21913    //可以看到已經修改成功
5 S     2  21913  21910  0  70 -10 - 103658 pipe_w ?       00:00:00 httpd

七、進程管理命令

1、ps命令

  • 命令解釋
      ps - report a snapshot of the current processes(查看當前系統中所有運行進程的狀態)
  • 命令語法
      ps [選項]
  • 命令常用選項
選 項 作 用
a 顯示所有終端的所有進程,除了階段作業領導者之外
-a 顯示當前終端的所有進程,包括其他用戶的進程
-u 顯示進程的歸屬用戶及內存的使用情況
x 顯示沒有控制終端的進程
-A 或 -e 顯示所有進程
-f 顯示較爲詳細的信息
-l 長格式顯示更加詳細的信息

  通常我們使用 ps -auxps -ef 配合管道符號(|)來查看特定進程的狀態信息。

  • ps aux 命令執行結果各字段解釋;
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19360  1524 ?        Ss   21:47   0:01 /sbin/init
root          2  0.0  0.0      0     0 ?        S    21:47   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    21:47   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    21:47   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    21:47   0:00 [stopper/0]
root          6  0.0  0.0      0     0 ?        S    21:47   0:00 [watchdog/0]
...省略部分信息

  下表對各字段的含義進行解釋:

字 段 含 義
USER 運行該進程的用戶名稱
PID 該進程的 ID
%CPU 該進程佔用CPU的百分比
%MEM 該進程佔用物理內存的百分比
VSZ 該進程佔用虛擬內存的大小,單位爲 KB
RSS 該進程佔用實際物理內存的大小,單位爲 KB
TTY 該進程是在哪個終端運行的。其中,tty1 ~ tty7 代表本地控制檯終端,pts/0 ~ 255 代表虛擬終端,一般是遠程連接的終端
STAT 該進程的狀態。D:不可中斷的睡眠狀態,通常用於 I/O 情況;S:睡眠狀態,可被喚醒;T:停止狀態;R:正在運行;Z:殭屍進程,進程已經終止,但仍然佔用一些系統資源;-<:高優先級;-N:低優先級;-s:包含子進程;-l:多線程;-+:位於後臺
START 進程的啓動時間
TIME 該進程佔用 CPU 的時間
COMMAND 產生該進程的命令名
  • ps -le 命令執行結果各字段解釋;
[root@localhost ~]# ps -le
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 -  4840 poll_s ?        00:00:01 init
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0 -40   - -     0 migrat ?        00:00:00 migration/0
1 S     0      4      2  0  80   0 -     0 ksofti ?        00:00:00 ksoftirqd/0
1 S     0      5      2  0 -40   - -     0 cpu_st ?        00:00:00 stopper/0
1 S     0      6      2  0 -40   - -     0 watchd ?        00:00:00 watchdog/0
...省略部分信息

  下表對各字段的含義進行解釋:

字 段 含 義
F 進程標誌,表示進程的權限,常見的有:1 進程可以被複制,但不能被執行;4 進程使用超級用戶權限
S 該進程的狀態,具體與"ps aux"中的STAT字段相同
UID 運行該進程的用戶 ID
PID 該進程的 ID
PPID 該進程父進程的 ID
C 該進程佔用CPU的百分比
PRI 動態優先級(priority),由內核動態調整
NI 靜態優先級(nice),用戶可以進行調整
ADDR 該進程在內存中的位置
SZ 該進程佔用內存的大小
WCHAN 該進程是否運行。"-"代表正在運行
TTY 該進程是在哪個終端運行的
TIME 該進程佔用 CPU 的時間
CMD 產生該進程的命令名
  • 實例

  查看http服務的進程狀態;

[root@localhost ~]# ps -ef | grep httpd
root       2155      1  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2157   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2158   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2159   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2160   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2161   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2162   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2163   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
apache     2164   2155  0 00:44 ?        00:00:00 /usr/sbin/httpd
root       2166   1804  0 00:44 pts/0    00:00:00 grep httpd

2、pstree命令

  • 命令解釋
      pstree - display a tree of processes(以樹形結構顯示進程之間的關係)

使用命令 yum install psmisc 安裝 pstree 命令。

  • 命令語法
      ps [選項]
  • 命令常用選項
選 項 作 用
-A 使用ASCII字符繪製樹
-U 使用UTF-8字符繪製樹
-p 顯示進程的 PID
-u 顯示進程對應的用戶名稱
  • 實例

  查看進程樹

[root@localhost ~]# pstree
init─┬─NetworkManager─┬─dhclient    //其中init進程是系統啓動的第一個進程,是系統中所有進程的父進程
     │                └─{NetworkManager}
     ├─atd
     ├─auditd───{auditd}
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─master─┬─pickup
     │        └─qmgr
     ├─6*[mingetty]
     ├─modem-manager
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─sshd───bash───pstree
     │      └─sshd───sftp-server
     ├─udevd───2*[udevd]
     └─wpa_supplicant

3、pgrep命令

  • 命令解釋
      pstree - look up based on name(根據進程名來查詢進程)
      一般是用來判斷程序是否正在運行。
  • 命令語法
      pgrep [選項] [pattern]
  • 命令常用選項
選 項 作 用
-l 同時顯示 PID 和進程名稱
-o 即 old,當匹配程序有多個進程時,顯示進程號最小的那個(最先啓動的)
-n 即 new,當匹配程序有多個進程時,顯示進程號最大的那個(進程號越大,並不一定意味進程的啓動時間越晚)
  • 實例

  ① 查看httpd服務的進程 ID 和名稱;

[root@localhost ~]# pgrep -l  httpd
2106 httpd
2108 httpd
2109 httpd
2110 httpd
2111 httpd
2112 httpd
2113 httpd
2114 httpd
2115 httpd

  ② 查看httpd服務最先啓動的進程 ID;

[root@localhost ~]# pgrep -o  httpd
2106

4、kill命令

  • 命令解釋
      kill - terminate a process(終止指定的進程)
      kill 從字面意義看起來是殺死進程,但從本質來講,kill 命令只是向進程發送一個信號,這個信號是什麼取決於用戶。
  • 命令語法
      kill [-信號] PID
      kill 命令重點在於信號而不在選項,所以這裏不作描述。
  • 常用信號
信 號 信號名 含 義
0 SIGEXIT 不發送任何信號,一般用來檢查一個進程是否存在
1 SIGHUP 斷開終端連接,這個信號也會造成某些進程在沒有終止的情況下重新初始化
2 SIGINT 結束進程,但並不是強制性的,相當於組合鍵 “Ctrl+c”
3 SIGQUIT 退出,相當於組合鍵 “Ctrl+/”
9 SIGKILL 殺死進程,即強制結束進程
15 SIGTERM 正常結束進程,是 kill 命令的默認信號
18 SIGCONT 恢復進程的執行
19 SIGSTOP 暫停進程的執行,相當於組合鍵 “Ctrl+z”

  如果需要查看所有信號及其對應編號,可以使用 kill -l 命令,通過對這裏的瞭解,我們可以知道kill 命令只是發送一個"信號",所以只有當信號被成功捕獲的時候 kill 命令才能發揮相應的作用。

  • 實例

  ① 結束httpd服務的一個子進程;

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服務
        |-httpd(1922)-+-httpd(1924)
        |             |-httpd(1925)
        |             |-httpd(1926)
        |             |-httpd(1927)
        |             |-httpd(1928)
        |             |-httpd(1929)
        |             |-httpd(1930)
        |             `-httpd(1931)
[root@localhost ~]# kill 1931    //殺死PID爲1931的httpd進程,正常停止
[root@localhost ~]# pstree -p | grep httpd
        |-httpd(1922)-+-httpd(1924)
        |             |-httpd(1925)
        |             |-httpd(1926)
        |             |-httpd(1927)
        |             |-httpd(1928)
        |             |-httpd(1929)
        |             `-httpd(1930)    //可以發現進程號爲1931的子進程已經結束

  ② 重啓進程;

[root@localhost ~]# kill -1 1922    //-1信號,可以讓進程重新啓動
[root@localhost ~]# pstree -p | grep httpd
        |-httpd(1922)-+-httpd(1953)
        |             |-httpd(1954)
        |             |-httpd(1955)
        |             |-httpd(1956)
        |             |-httpd(1957)
        |             |-httpd(1958)
        |             |-httpd(1959)
        |             `-httpd(1960)    //httpd服務的子進程PID都改變了,說明重啓成功

5、killall命令

  • 命令解釋
      killall - kill processes by name(根據名字終止進程)
      killall 命令不再和 kill 命令只能通過 PID 來殺死單個進程,而是通過進程名來殺死一類進程。可以和 ps、pstree 等命令配合使用。
  • 命令語法
      kill [-信號] 進程名
  • 常用信號
      信號與 kill 命令是一致的,所以這裏省略掉啦!
  • 實例

  結束httpd服務

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服務
        |-httpd(1922)-+-httpd(1953)
        |             |-httpd(1954)
        |             |-httpd(1955)
        |             |-httpd(1956)
        |             |-httpd(1957)
        |             |-httpd(1958)
        |             |-httpd(1959)
        |             `-httpd(1960)
[root@localhost ~]# killall httpd    //直接指定進程名結束進程
[root@localhost ~]# pstree -p | grep httpd    //httpd服務已經正常結束

6、pkill命令

  • 命令解釋
      pkill - signal processes based on name and other attributes(根據進程名和其他屬性進程處理信號)
      pkill 是 ps 命令和 kill 命令的結合,與 killall 命令的用法相同,都是通過進程名殺死一類進程。除此之外 pkill 命令可以用來踢出登錄用戶。
  • 命令語法
      pkill [-信號] [-t 終端號] 進程名
  • 常用信號
      信號與 kill 命令是一致的,同樣這裏省略掉啦!
  • 實例

  ① 結束httpd服務

[root@localhost ~]# pstree -p | grep httpd    //查看httpd服務
        |-httpd(2251)-+-httpd(2253)
        |             |-httpd(2254)
        |             |-httpd(2255)
        |             |-httpd(2256)
        |             |-httpd(2257)
        |             |-httpd(2258)
        |             |-httpd(2259)
        |             `-httpd(2260)
[root@localhost ~]# pkill httpd    //直接指定進程名結束進程
[root@localhost ~]# pstree -p | grep httpd    //httpd服務已經正常結束

  ② 踢出登錄用戶

[root@localhost ~]# who    //查看本機已登錄的用戶
root     pts/0        2020-04-15 11:39 (192.168.140.1)
root     pts/1        2020-04-15 13:08 (192.168.140.1)    //兩個root用戶已經遠程登錄
[root@localhost ~]# pkill -9 -t pts/1    //強制殺死從pts/1虛擬終端登錄的進程
[root@localhost ~]# who
root     pts/0        2020-04-15 11:39 (192.168.140.1)    //虛擬終端pts/1的登錄進程已經被殺死

7、top命令

  • 命令解釋
      top - display Linux tasks(顯示Linux任務)
      top 可以動態地持續監聽進程的運行狀態,並且還提供了一個交互界面,可以根據需求個性化地制定輸出內容,對某一資源使用情況的字段進行排序等操作。
  • 命令語法
      top [選項]
  • 命令常用選項
選 項 作  用
-d 秒數 指定 top 命令每隔幾秒更新,默認爲3秒
-n 次數 指定 top 命令執行的次數
-b 批處理模式,一般與"-n"選項合用,用於把top命令重定向到文件中
-p 進程PID 僅監聽指定 PID 的進程
-u 用戶名 僅監聽指定用戶的進程
  • top 命令執行結果各字段解釋
top - 19:13:02 up  7:34,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  88 total,   1 running,  87 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004136k total,   219592k used,   784544k free,    28220k buffers
Swap:  2097148k total,        0k used,  2097148k free,    58320k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     1 root      20   0 19360 1524 1228 S  0.0  0.2   0:01.50 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.04 watchdog/0
...省略部分信息

  第一行爲任務隊列信息,與 uptime 命令執行結果相同,具體含義如下:

字 段 解 釋
19:13:02 系統當前時間
up 1 day, 7:34 系統的運行時間。本機已經運行1天7小時34分鐘
1 user 當前登錄了一個用戶
load average: 0.00, 0.01, 0.05 系統在1分鐘內、5分鐘內、15分鐘內的平均負載。如果這些數值高於cpu的數量,則你的系統可能在超負荷運轉

  第二行爲進程(Tasks) 信息,具體含義如下:

字 段 解 釋
88 total 系統中的進程總數
1 running 正在運行的進程數
87 sleeping 睡眠的進程數
0 stopped 停止的進程數
0 zombie 殭屍進程數

  第三行爲 CPU(Cpu(s)) 信息,具體含義如下:

字 段 解 釋
0.3%us 用戶空間佔用的 CPU 百分比
0.0%sy 系統空間佔用的 CPU 百分比
0.0%ni 改變過優先級的進程的 CPU 百分比
99.7%id 空閒 CPU 佔用的 CPU 百分比
0.0%wa 等待 I/O 的進程佔用的 CPU 百分比
0.0%hi 處理硬中斷佔用的 CPU 百分比
0.0%si 處理軟中斷佔用的 CPU 百分比
0.0%st 虛擬時間百分比。即當有虛擬機時,虛擬 CPU 等待實際 CPU 的時間百分比

  第四行爲物理內存(Mem) 信息,具體含義如下:

字 段 解 釋
1004136k total 物理內存的總量
219592k used 己經使用的物理內存大小
784544k free 空閒的物理內存大小
28220k buffers 作爲緩衝的內存大小

  第五行爲交換分區(Swap) 信息,具體含義如下:

字 段 解 釋
2097148k total 交換分區的大小
0k used 已經使用的交換分區的大小
2097148k free 空閒交換分區的大小
58320k cached 作爲緩存的交換分區的大小

  再往下所有行爲系統進程信息,各字段的含義如下:

字 段 解 釋
PID 該進程的 ID
USER 該進程所屬的用戶
PR 優先級(系統內核層面的概念),數值越小優先級越高
NI 優先級(nice值,用戶層面的概念),數值越小、優先級越高
VIRT 該進程使用的虛擬內存的大小,單位爲 KB
RES 該進程使用的物理內存的大小,單位爲 KB
SHR 該進程使用的共享內存大小,單位爲 KB
S 該進程狀態
%CPU 該進程佔用 CPU 的百分比
%MEM 該進程佔用內存的百分比
TIME+ 該進程共佔用的 CPU 時間
COMMAND 運行該進程使用的命令名
  • 實用的一些交互操作

① 顯示全部CPU核心的負載情況;

  在 top 基本視圖中,按下鍵盤數字"1",可以顯示全部CPU核心的負載情況。再次按下"1",就會隱藏它們。
在這裏插入圖片描述
② 背光模式;

  按下鍵盤"b",可以進入背光模式,默認爲當前處於運行(running)態的進程加上背光。按鍵"y"可以對處於運行(running)態的進程加上/取消背光,按鍵"x"可以對排序字段加上/取消背光
在這裏插入圖片描述

③ 字段排序;

  top 默認是以佔用CPU的百分比來排序的,通過組合鍵"shift + >"或"shift + <"可以向右或向左改變排序列。
  按一次"shift + >"即可以佔用內存的百分比(%MEM)來進行排序。
在這裏插入圖片描述

8、vmstat命令

  • 命令解釋
      vmstat - Report virtual memory statistics(報告虛擬內存統計信息)
      vmstat 可以動態地監控系統總體的資源使用情況,例如 CPU 使用、進程狀態、內存使用、虛擬內存使用、硬盤輸入/輸出狀態等信息。
  • 命令語法
      vmstat [選項] [刷新間隔時間 [ 刷新次數]]
  • 命令常用選項
選 項 作  用
-a 顯示活躍和非活躍內存
-d 顯示各個磁盤相關統計信息
-D 顯示磁盤整體信息
-p 分區設備文件名 顯示指定磁盤分區統計信息
-s 顯示內存相關統計信息和多種系統活動數量
-t 將時間戳添加到輸出內容中
-s 單位 使用指定單位顯示。單位:k、K、m、M分別代表 1000、1024、1000000、1048576字節(bytes),默認爲k(1024bytes)
-V 顯示vmstat版本信息
  • vmstat 命令執行結果各字段解釋;
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 584440  44204 216116    0    0     4     7   17   16  0  0 99  0  0

  下表對各字段的含義進行解釋:

字 段 選 項 解 釋 說 明
procs r 等待運行的進程數 數值越大,系統越繁忙。當這個值超過CPU個數,就會出現CPU瓶頸
b 等待I/O的進程數量 數值越大,系統越繁忙
memory swpd 已使用虛擬內存大小 當值大於0時,表示物理內存不足,需要考慮升級內存
free 空閒內存大小 指物理內存空閒大小
buff 用作緩衝的內存大小 緩衝(buffer):用於存儲速度不同步的設備或優先級不同的設備之間傳輸數據。向硬盤寫入數據時,先把數據放入緩衝區,然後再一起向硬盤寫入,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反覆尋道,從而提高系統性能
cache 用作緩存的內存大小 緩存(cache):位於CPU和主內存之間的容量較小但速度很快的存儲器,CPU速度遠遠高於主內存的速度,所以從中讀取數據需要等待很長的時間。所以把最常用的數據保存在緩存區中,再次讀取該數據時,直接從緩存中讀取,減少CPU等待的時間,從而提高系統性能
swap si 每秒從交換區寫入內存的數據大小 表示數據由磁盤調入內存,這個數值越大,表明數據需要經常在磁盤和內存之間進行交換,系統性能越差
so 每秒從內存寫入交換區的數據大小 表示數據由內存調入磁盤,數值大小影響系統的效用同 “si
io bi 每秒讀取的塊數 現在的Linux版本塊的大小爲1024bytes
bo 每秒寫入的塊數 如果 bi+bo 的值越大,則表示系統磁盤I/O越繁忙
system in 每秒中斷數,包括時鐘中斷 這個值越大,表示系統與接口設備的通信越繁忙
cs 每秒上下文切換數 數值大小影響系統的效用同 “in
cpu us 用戶進程消耗 CPU 運算時間的百分比 這個值比較高時,表示用戶進程消耗的CPU時間多。如果長時間超過50%,那麼我們就需要考慮優化程序算法或其他措施
sy 內核進程消耗 CPU 運算時間的百分比 這個值比較高時,表示系統內核消耗的CPU時間多,性能方面可能有一些問題,需要我們檢查原因。一般來說"us+sy"應該小於80%
id 空閒 CPU 的百分比 如果這個值持續爲0並且系統時間(cpu sy)是用戶時間(cpu us)的兩倍,系統則面臨着CPU資源的短缺
wa 等待 I/O 所佔用的 CPU 運算時間百分比 這個值比較高時,說明I/O等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸
st 虛擬 CPU 佔用實際 CPU 運算時間的百分比 即虛擬機所佔用的 CPU 運算時間百分比
  • 實例

  使用vmstat檢測系統,每隔1秒刷新一次,共刷新3次,同時輸出時間戳;

[root@localhost ~]# vmstat -t 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 764164  52540  54220    0    0    12     2   11   13  0  0 99  0  0        2020-04-20 13:58:29 CST
 0  0      0 764116  52540  54220    0    0     0     0   17   18  0  1 99  0  0        2020-04-20 13:58:30 CST
 0  0      0 764116  52540  54220    0    0     0     0   13   14  0  0 100  0  0       2020-04-20 13:58:31 CST

9、lsof命令

  • 命令解釋
      lsof - list open files(列出打開的文件)
      通過 lsof 命令,可以根據文件找到對應的進程信息,也可以根據進程信息找到進程打開的文件。
  • 命令語法
      top [選項]
  • 命令常用選項
選 項 作  用
-c string 列出以 string 開頭的進程打開的文件
-p pid 列出進程號爲 PID 進程打開的文件
-u uname/uid 列出歸屬 uname/uid 的進程打開的文件
-g gname/gid 列出歸屬 gname/gid 的進程打開的文件
+d 目錄 列出目錄下所有被進程打開的文件
+D 目錄 不但列出目錄下的,同時也會搜索目錄下的目錄,時間較長
-d fd 列出文件描述符爲 fd 的進程
-i [4,6] [protocol] [ @hostname|hostaddr ] [ :service|port ] 列出符合條件的進程
4,6 → IPV4 or IPV6
protocol → TCP or UDP
@hostname → Internet host name
hostaddr → IP地址
service → /etc/services中的service name
port → 端口號
  • lsof 命令執行結果各字段解釋;
[root@localhost ~]# lsof    
COMMAND    PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init         1      root  cwd       DIR                8,3     4096          2 /
init         1      root  rtd       DIR                8,3     4096          2 /
init         1      root  txt       REG                8,3   150352     653834 /sbin/init
init         1      root  mem       REG                8,3    65960     261170 /lib64/libnss_files-2.12.so
...省略部分信息

  下表對各字段的含義進行解釋:

字 段 解 釋
COMMAND 進程的名稱
PID 進程標識符
USER 進程所有者
FD 文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
TYPE 文件類型。如REG、DIR等
DEVICE 指定磁盤的名稱
SIZE/OFF 文件的大小
NODE 索引節點
NAME 打開的文件確切名稱
  • 實例

  ① 遞歸查看 /usr/bin 目錄下所有打開的文件;

[root@localhost ~]# lsof +D /usr/lib
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
crond   1732 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
bash    1823 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
bash    3007 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof    3131 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive
lsof    3132 root mem    REG    8,3 99164480 393263 /usr/lib/locale/locale-archive

  ② 查看某個文件被哪個進程調用;

[root@localhost ~]# lsof /sbin/init
COMMAND PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
init      1 root txt    REG    8,3   150352 653834 /sbin/init

  ③ 列出httpd服務的進程所打開的文件;

[root@localhost ~]# lsof -c httpd
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
httpd   3031   root  cwd    DIR    8,3     4096      2 /
httpd   3031   root  rtd    DIR    8,3     4096      2 /
httpd   3031   root  txt    REG    8,3  2163426 412492 /usr/local/httpd-2.4.41/bin/httpd
...省略部分信息

  ④ 列出使用特定的tcp端口的進程;

[root@localhost ~]# lsof -i tcp:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   3031   root    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3032 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3033 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)
httpd   3034 daemon    4u  IPv6  22199      0t0  TCP *:http (LISTEN)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章