目錄
一、什麼是程序和進程?
程序:一組計算機能識別和執行的指令集合,可以按照既定的邏輯控制計算機運行來完成特定的功能。
進程:正在運行的程序,是操作系統進行資源分配和調度的基本單位,每個進程都有獨立的地址空間,並且佔用一定的系統資源。
區別和關係:
① 程序是靜態的,它只是一組指令的集合,而進程是程序運行的動態過程。
② 進程和程序並不是一一對應的關係,同一個程序運行在不同的數據集上就是不同的進程。
③ 程序是封閉的,而進程具有併發性和交往性。
二、什麼是線程?
線程:操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。
線程與進程的關係:
① 一個進程可以擁有多個線程,而一個線程同時只能被一個進程所擁有。
② 線程不能單獨執行,但每一個線程都有程序入口、執行序列以及程序出口,它必須組成進程才能被執行。
三、進程的生命週期
父進程調用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 -aux 和 ps -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)