1. 程式人生 > 實用技巧 >torch.tensor拼接與list(tensors)

torch.tensor拼接與list(tensors)

一:程序介紹

1.什麼是程序?

  • 正在執行的程式
  • 正在計算機上執行的程式例項
  • 能分配處理器並由處理器執行的實體

2.程序 與 程式

名稱描述狀態
程式 存放程式碼的檔案 靜態
程序 程式的執行過程 動態
同一個程式可能對應多個程序

父程序與子程序:

  • 父程序:程式執行時產生的第1個程序
  • 子程序:由父程序衍生fork()出來的程序

注意:

如果父程序終止,子程序 也會隨之被終止

3.程序狀態

程序的兩個基本元素是程式程式碼和程式碼相關聯的資料集

程序是一種動態描述,但並不代表所有的程序都在執行,這就可以引入‘程序狀態’

程序在記憶體中因策會略或排程需求, 會處於各種狀態:

狀態描述STAT狀態+符號描述
R 程序執行 s 程序是控制程序, Ss程序的領導者,父程序
S 可中斷睡眠 < 程序執行在高優先順序上,S<優先順序較高的程序
T 程序被暫停 N 程序執行在低優先順序上,SN優先順序較低的程序
D 不可中斷睡眠 + 當前程序執行在前臺,R+該表示程序在前臺執行(正在io操作,一旦停止,資料丟失)
Z 殭屍程序 l 程序是多執行緒的,Sl表示程序是以執行緒方式執行
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)
", /* 1 */ "D (disk sleep)", /* 2 */ "T (stopped)", /* 4 */ "t (tracing stop)", /* 8 */ "X (dead)", /* 16 */ "Z (zombie)", /* 32 */ };

R - 可執行狀態(執行狀態)

只有在執行狀態的程序才有可能在CPU上執行,注意是可能,並不意味著程序一定在執行中

同一時刻可能有多個程序處在可執行狀態,這些程序的PCB(程序控制塊)被放入對應CPU的可執行佇列中

然後程序排程器 從各個可執行佇列中分別選擇一個程序在CPU上執行

另外如果計算機只有一個處理器,那麼一次最多隻有一個程序處於這種狀態

S - 可中斷睡眠狀態(sleeping)

處在這個狀態意味著程序在等待事件完成

這些程序的PCB(task_struct結構)被放入對應時間的等待佇列 中

然後等待的事件發生時,對應的程序將被喚醒

D - 不可中斷睡眠(disk sleep)

在這個狀態的程序通常會等待IO的結束

這個狀態與sleeping狀態相似,處於睡眠狀態

但是此刻程序是不可中斷的,意思是不響應非同步訊號。

另外你會發現處在D狀態的程序kill -9竟然也殺不死

這就相當於我們怎麼也叫不醒一個裝睡的人

T - 暫停狀態

給程序傳送一個SIGSTOP訊號,程序就會響應訊號進入T狀態,除非該程序正處在D狀態

再通過傳送SIGCONT訊號讓程序繼續執行

kill -SIGSTOP
kill -SIGCONT

Z - 殭屍狀態

殭屍狀態是一個比較特殊的狀態

程序在退出的過程中,處於TASK_DEAD狀態

在這個退出過程中,程序佔有的所有資源將被回收,除了task_struct結構(以及少數資源)以外

於是程序就只剩下task_struct這麼個空殼,故稱為殭屍

X-死亡狀態 或 退出狀態(dead) 死亡狀態是核心運⾏ kernel/exit.c ⾥的 do_exit() 函式返回的狀態

這個狀態只是⼀個返回狀態, 你不會在任務列表⾥看到這個狀態

4.程序狀態切換

程序的3種狀態

① 就緒態

當程序已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行,這時的程序狀態稱為就緒狀態

② 執行態

當程序已獲得處理機,其程式正在處理機上執行,此時的程序狀態稱為執行狀態

③ 阻塞態

正在執行的程序,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態

引起程序阻塞的事件 可有多種,例如,等待I/O完成、申請緩衝區不能滿足、等待信件(訊號)等

狀態切換

就緒 → 執行

處於就緒狀態的程序,當程序排程程式為之分配了處理器後,該程序便由就緒狀態轉變成執行狀態

執行 → 就緒

處於執行狀態的程序在其執行過程中,因分配給它的一個時間片已用完而不得不讓出處理機,於是程序從執行狀態轉變成就緒狀態

執行 → 阻塞

正在執行的程序因等待某種事件(檔案讀寫等IO操作)發生而無法繼續執行時,便從執行狀態變成阻塞狀態

阻塞 → 就緒

處於阻塞狀態的程序,若其等待的事件已經發生,於是程序由阻塞狀態轉變為就緒狀態

5.程序的優先順序

① 什麼是優先順序?

優先順序(priority)是一種約定,優先順序高的先做,優先順序低的後做

優先順序高的可以優先享受資源,比如排隊買票時,軍人優先、老人優先、人民幣玩家優先等

② 為什麼要有系統優先順序?

舉個栗子

海底撈火鍋正常情況下響應服務就特別快

但是 當節假日來臨時,顧客數量急劇上升,就會導致處理請求特別慢

假設我是海底撈SVIP客戶(最高優先順序),無論門店多麼繁忙,我都不用排隊

海底撈人員會直接服務於我,滿足我的需求

哪些不是VIP的顧客(較低優先順序)則進入排隊等待狀態

③ 如何配置程序的優先順序?

在啟動程序時,為不同的程序使用不同的排程策略
  • nice 值越高: 表示優先順序越低,例如+19,該程序容易將CPU 使用量讓給其他程序
  • nice 值越低: 表示優先順序越高,例如-20,該程序更不傾向於讓出CPU
1.用topps命令檢視程序的優先順序
NI: 實際nice級別,預設是0。 
PR: 顯示nice值,-20對映到0,+19對映到39
[root@localhost ~]# top
top - 16:35:16 up 19 min,  1 user,  load average: 0.00, 0.01, 0.01
Tasks: 103 total,   1 running, 101 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995696 total,   736876 free,   156644 used,   102176 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   712688 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     1 root      20   0  127992   6604   4148 S   0.0  0.7   0:01.17 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
....



[root@localhost ~]# ps axo command,nice| grep vim
grep --color=auto vim         0
2.nice指定程式的優先順序
語法格式:
nice -n 優先順序數字 程序名稱
#1.開啟vim並且指定程式優先順序為-5
[root@localhost ~]# nice -n -5 vim &
[1] 1123

#2.檢視該程序的優先順序情況
[root@localhost ~]# ps axo command,nice| grep 1123
grep --color=auto 1123        0

[3]+  Stopped                 nice -n -5 vim
3.renice命令修改一個正在執行的程序優先順序
語法格式
renice -n 優先順序數字 程序pid
# 1.檢視sshd程序當前的優先順序狀態
[root@localhost ~]# ps axo pid,command,nice |grep [s]shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D             0
 
# 2.調整sshd主程序的優先順序
[root@localhost ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20

# 3.調整之後記得退出終端
[root@localhost ~]# ps axo pid,command,nice |grep [s]shd
 70840 sshd: root@pts/2              0
 98002 /usr/sbin/sshd -D           -20
[root@localhost ~]# exit

# 4.當再次登陸sshd服務,會由主程序fork子程序(那麼子程序會繼承主程序的優先順序)
[root@localhost ~]# ps axo pid,command,nice |grep [s]shd
 98002 /usr/sbin/sshd -D           -20
 98122 sshd: root@pts/0            -20

二:檢視程序

1.常用組合ps aux

ps aux是常用組合,檢視程序使用者、PID、佔用CPU百分比、佔用記憶體百分比、狀態、執行的命令

選項釋義
-a 顯示一個終端的所有程序
-u 選擇有效的使用者id或者是使用者名稱
-x 顯示沒有控制終端的程序,同時顯示各個命令的具體路徑。

例項

[root@localhost ~]# ps aux |head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 128124  6740 ?        Ss   07:32   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    07:32   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   07:32   0:00 [kworker/0:0H]
root          5  0.0  0.0      0     0 ?        S    07:32   0:00 [kworker/u256:0]

例項狀態分析

狀態釋義
USER 啟動程序的使用者
PID 程序執行的ID號
%CPU 程序佔用CPU百分比
%MEM 程序佔用記憶體百分比
VSZ 程序佔用虛擬記憶體大小 (單位KB:killobytes)
RSS 程序佔用實體記憶體實際大小 (單位KB)
TTY 程序是由哪個終端執行啟動的tty1、pts/0等 ?表示核心程式與終端無關(遠端連線會通過tty開啟一個bash:tty)
STAT 程序執行過程中的狀態 man ps (/STATE)
START 程序的啟動時間
TIME 程序佔用 CPU 的總時間(為0表示還沒超過秒)
COMMAND 程式的執行指令,[ ] 屬於核心態的程序
沒有 [ ] 的是使用者態程序。systemctl status 指令
STAT - 程序狀態引數詳解
狀態釋義
R 執行
S 可中斷睡眠 Sleep
即在睡眠的過程中可以接收訊號喚醒 -> 執行的IO操作可以得到硬體裝置的響應
D 不可中斷睡眠
即在睡眠的過程中不可以接收訊號喚醒 -> 執行的IO操作得不到硬體裝置的響應
T 停止的程序
Z 殭屍程序
X 死掉的程序(幾乎看不見,因為死了就立即回收了)
< 標註了<小於號代表優先順序較高的程序
N 代表優先順序較低的程序
s 包含子程序
+ 表示是前臺的程序組
l 小寫字母l,代表以執行緒的方式執行,即多執行緒
管道符號代表多程序

2.Linux程序的2種睡眠狀態

① Interruptible Sleep(可中斷睡眠,在ps命令中顯示“S”)

處在這種睡眠狀態的程序是可以通過給它傳送signal來喚醒的

比如:發HUP訊號給nginx的master程序可以讓nginx重新載入配置檔案而不需要重新啟動nginx程序

② Uninterruptible Sleep(不可中斷睡眠,在ps命令中顯示“D”)

處在這種狀態的程序不接受外來的任何signal

這也是為什麼之前我無法用kill殺掉這些處於D狀態的程序

無論是killkill-9kill-15是按 Ctrl+C 、Ctrl+Z 都無濟於,因為它們根本就不受這些訊號的支配

解釋

程序為什麼會被置於D狀態呢?
處於uninterruptible sleep狀態的程序通常是在等待IO,比如磁碟IO,網路IO,其他外設IO
如果程序正在等待的IO在較長的時間內都沒有響應,那麼就很會不幸地被ps看到了
同時也就意味著很有可能有IO出了問題
可能是外設本身出了故障,也可能是比如NFS掛載的遠端檔案系統已經不可訪問了

正是因為得不到IO的響應,程序才進入了uninterruptible sleep狀態
所以要想使程序從uninterruptible sleep狀態恢復,就得使程序等待的IO恢復
比如如果是因為從遠端掛載的NFS卷不可訪問導致程序進入uninterruptible sleep狀態的
那麼可以通過恢復該NFS卷的連線來使程序的IO請求得到滿足
除此之外,要想幹掉處在D狀態程序就只能重啟整個Linux系統了(恐怖的D狀態)

看到有人說如果要想殺掉D狀態的程序,通常可以去殺掉它的父程序(通常是shell,我理解的這種情況是在shell下直接執行的該程序,之後該進 程轉入了D狀態),於是我就照做了,之後就出現了上面的狀態:
他們的父程序被殺掉了,但是他們的父程序PID都變成了1,也就是init程序,這下可如何是好?
此時我這些D狀態的程序已經影響到其他一些程序的執行,而已經無法訪問的NFS卷又在段時間內無法恢復,那麼,只好重新啟動了。

強調

D與Z狀態的程序都無法用kill -9殺死

3.例項

① 檢視執行狀態

# 1.(視窗1)執行vim
[darker@localhost ~]$ vim 1.txt

# 2.(視窗2)檢視vim的執行狀態為:S+
[root@localhost ~]# ps aux |grep [v]im
darker    11060  0.6  0.4 149280  4968 pts/1    S+   09:27   0:00 vim 1.txt


# 3.(視窗1):Ctrl+z 將程序防止到後臺
[1]+  Stopped                 vim 1.txt

# 4.(視窗2):檢視vim的執行狀態為:T
[root@localhost ~]# ps aux |grep [v]im
darker    11060  0.0  0.5 149280  5008 pts/1    T    09:27   0:00 vim 1.txt

② 檢視S+、R+、D+

# 1.(視窗1)執行vim
[darker@localhost ~]$ tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/

# 2.(視窗2)檢視vim的執行狀態為:S+
[root@localhost ~]# while true;do ps aux |grep [t]ar;sleep 0.3;clear;done
darker    11100 14.5  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.6  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.4  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.4  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.5  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.3  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.4  0.4 126972  4456 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.5  0.4 126972  4688 pts/1    S+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
darker    11100 14.3  0.4 126972  4688 pts/1    R+   09:32   0:09 tar cvzf darker.tar.gz /etc/ /usr/ /var/ /usr/
...

③ 檢視程序樹

# 安裝pstree

④ 檢視ppid

[root@localhost ~]# ps -ef | head -10
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 07:32 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 07:32 ?        00:00:00 [kthreadd]
root          4      2  0 07:32 ?        00:00:00 [kworker/0:0H]
root          5      2  0 07:32 ?        00:00:00 [kworker/u256:0]
root          6      2  0 07:32 ?        00:00:00 [ksoftirqd/0]
root          7      2  0 07:32 ?        00:00:00 [migration/0]
root          8      2  0 07:32 ?        00:00:00 [rcu_bh]
root          9      2  0 07:32 ?        00:00:02 [rcu_sched]
root         10      2  0 07:32 ?        00:00:00 [lru-add-drain]

4.動態檢視

基本用法

[root@localhost ~]# top
[root@localhost ~]# top -d 1 # 1秒重新整理一次
[root@localhost ~]# top -d 1 -p 程序的pid
[root@localhost ~]# top -d 1 -p `pgrep nginx | head -1`
[root@localhost ~]# top -d 1 -p `pgrep sshd | head -1`,33 # 檢視sshd以及pid為33的

[root@localhost ~]# top -d 1 -u nginx # 檢視指定使用者程序
[root@localhost ~]# top -b -n 2 > top.txt # 將2次top資訊寫入到檔案

top的引數詳解

引數描述
up左邊的時間 當前系統時間
up右邊的時間 運行了多長時間
users 當前登入的使用者數
load average CPU 1分鐘的平均負載
CPU 2分鐘的平均負載
CPU 15分鐘的平均負載
Tasks total:總任務數
running:正在執行的程序數
sleeping:休眠的程序數
stopped:停止的程序數
zombie:殭屍程序數
%Cpu(s) us:使用者態程序佔用cpu時間的百分比
sys:核心態程序佔用cpu時間的百分比
ni:代表優先被排程的程序佔cpu時間的百分比
id:cpu空閒的百分比
wa:cpu等待io的百分比
hi:硬體中斷,處理硬體中斷所佔用CPU的時間
si:軟體中斷,處理軟體中斷所佔用CPU的時間
st:被偷走的cpu百分比
KiB Men total:總實體記憶體
free:空閒實體記憶體
used:已用實體記憶體
buff/cache:快取
KiB Swap total:總交換分割槽記憶體
free:空閒交換分割槽記憶體
used:已用交換分割槽記憶體
avail Men:可用記憶體
PID 程序的ID
USER 程序屬於哪個使用者
PR 程序的優先順序
NI 程序的優先值(nice值)
VIRT 程序使用的虛擬記憶體大小
RES 程序的常駐記憶體
SHR 程序的共享記憶體
S 程序的狀態:
D=不可中斷的睡眠狀態
R=執行
S=睡眠
T=跟蹤/停止
Z=殭屍程序
%CPU 程序佔用CPU的百分比(可用超出100%,取決於有幾個CPU)
%MEM 程序佔用五路記憶體的百分比
TIME+ 程序使用CPU的時間(單位:1/100秒)
COMMAND 程序名稱(該程序由哪條命令執行的)

程序資訊

  • VIRT:virtual memory usage 虛擬記憶體

① 程序“需要的”虛擬記憶體大小,包括程序使用的庫、程式碼、資料等

② 假如程序申請100m的記憶體,但實際只使用了10m,那麼它會增長100m,而不是實際的使用量

  • RES:resident memory usage 常駐記憶體

① 程序當前使用的記憶體大小,但不包括swap out(當某程序向OS請求記憶體發現不足時,OS會把記憶體中暫時不 用的資料交換出去,放在SWAP分割槽中,這個過程稱為SWAP OUT。當某程序又需要這些資料且OS發現還有空閒 實體記憶體時,又會把SWAP分割槽中的資料交換回實體記憶體中,這個過程稱為SWAP IN)

② 包含其他程序的共享

③ 如果申請100m的記憶體,實際使用10m,它只增長10m,與VIRT相反

④ 關於庫佔用記憶體的情況,它只統計載入的庫檔案所佔記憶體大小

  • SHR:shared memory 共享記憶體

① 除了自身程序的共享記憶體,也包括其他程序的共享記憶體

② 雖然程序只使用了幾個共享庫的函式,但它包含了整個共享庫的大小

③ 計算某個程序所佔的實體記憶體大小公式:RES – SHR

④ swap out後,它將會降下來,因為記憶體充裕了,大家就沒必要合租記憶體了

  • DATA

① 資料佔用的記憶體。如果top沒有顯示,按f鍵、然後用空格選中DATA專案、然後按q則可以顯示出來。

② 真正的該程式要求的資料空間,是真正在執行中要使用的

top 的內部命令對程序的顯示方式進行控制

命令作用
M 按記憶體的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 對排序進行反轉
f 自定義顯示欄位
1 顯示所有CPU的負載
s 改變畫面更新頻率
h / ? 幫助
< 向前
> 向後
z 彩色
l 關閉或開啟第一部分第一行 top 資訊的表示
t 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 資訊的表示
m 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 資訊的表示
n 設定在程序列表所顯示程序的數量
q 退出top

序號與列名

序號列名含義
a PID 程序id
b PPID 父程序id
c RUSER Real user name 真實的使用者名稱
d UID 程序所有者的使用者id
e USER 程序所有者的使用者名稱
f GROUP 程序所有者的組名
g TTY 啟動程序的終端名。不是從終端啟動的程序則顯示為?
h PR 優先順序
i NI nice值:負值表示高優先順序,正值表示低優先順序
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 上次更新到現在的CPU時間佔用百分比
l TIME 程序使用的CPU時間總計,單位秒
m TIME+ 程序使用的CPU時間總計,單位1/100秒
n %MEM 程序使用的實體記憶體百分比
o VIRT 程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
p SWAP 程序使用的虛擬記憶體中,被喚出的大小,單位kb
q RES 程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
r CODE 可執行程式碼佔用的實體記憶體大小,單位kb
s DATA 可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
t SHR 共享記憶體大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到現在,被修改過的頁面數。
w S 程序狀態
(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程序)
x COMMAND 命令名/命令列
y WCHAN 若該程序在睡眠,則顯示睡眠中的系統函式名
z Flags 任務標誌,參考 sched.h

三:shell管理程序

1.優先順序管理

可以在啟動程序時用nice命令設定設定優先順序

① 命令

nice [-n <優先順序>] [--help] [--version] [執行指令]

② 選項

若 nice命令未指定優先順序的調整值,則以預設值10來調整程式執行優先順序,既在當前程式執行優先順序基礎之 上增加10

選項釋義
-n <優先順序> 指定優先順序
--help 幫助資訊;
--version 版本資訊;

③ 執行範例:讓命令以新的優先順序執行

[root@localhost ~]# $ nice -n 5 ls # nice -n -20 命令

④ ps -l 命令

其中的幾個重要資訊
引數描述
UID 代表執行者的身份
PID 代表這個程序的代號
PPID 代表這個程序是由哪個程序發展衍生而來的,亦即父程序的代號
PRI 代表這個程序可被執行的優先順序,其值越小越早被執行
NI 代表這個程序的nice值

PRI即程序的優先順序,此值越小程序的優先級別越高

而NI,也就是我們所要說的nice值(通過nice命令設 置),其表示程序可被執行的優先順序的修正數值

如前面所說,PRI值越小越快被執行,那麼加入nice值後, 將會使得PRI變為:PRI(new)=PRI(old)+nice

所以,nice命令設定的優先順序不是程式最終的優先順序,而只是優先順序的修正數值

renice命令允許使用者修改一個正在執行的程序的優先權

也可以對已執行的程序設定新的優先順序
[root@localhost ~]# renice -20 11111

2.給程序傳送訊號

列出所有支援的訊號

[root@localhost ~]#  kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

部分訊號解析

# HUP(1)
    1. 掛起訊號 
    2. 往往可以讓程序重新載入配置
    本訊號在使用者終端連線(正常或非正常)結束時發出, 通常是在終端的控制程序結束時
    通知同一session內的各個作業, 這時它們與控制終端不再關聯
    登入Linux時,系統會分配給登入使用者一個終端(Session)
    在這個終端執行的所有程式,包括前臺程序組和後臺程序組,一般都 屬於這個 Session
    當用戶退出Linux登入時,前臺程序組和後臺有對終端輸出的程序將會收到SIGHUP訊號
    這個訊號的預設操作為終止程序,因此前臺進 程組和後臺有終端輸出的程序就會中止
    不過,可以捕獲這個訊號,比如wget能捕獲SIGHUP訊號,並忽略它,這樣就算退出了Linux登入,wget也 能繼續下載
    此外,對於與終端脫離關係的守護程序,這個訊號用於通知它重新讀取配置檔案
    

# INT(2): 中斷,
    通常因為按下ctrl+c而產生的訊號,用於通知前臺程序組終止程序


# QUIT(3): 退出
    和SIGINT類似, 但由QUIT字元(通常是Ctrl-\)來控制
    程序在因收到SIGQUIT退出時會產生core檔案, 在這個意義上類似於一個程式錯誤訊號
    

# TSTP(20): 停止進行執行
    通常因為按下ctrl+z而產生的訊號


# KILL (9)
    用來立即結束程式的執行. 本訊號不能被阻塞、處理和忽略
    如果管理員發現某個程序終止不了,可嘗試傳送這個訊號


# TERM(15):
    終止,是不帶引數時kill預設傳送的訊號,預設是殺死程序,與SIGKILL不同的是該訊號可以被阻塞和處理
    通常用TERM訊號來要求程式自己正常退出,如果程序終止不了,我們才會嘗試SIGKILL


# CONT(18) 被暫停的程序將繼續恢復執行


# SIGSTOP(19) 暫停程序


# SIGCHLD
    子程序結束時, 父程序會收到這個訊號。
    如果父程序沒有處理這個訊號,也沒有等待(wait)子程序
    子程序雖然終止,但是還會在核心程序表中佔有表項,這時的子程序稱為殭屍程序。
    這種情況我們應該避免(父程序或者忽略SIGCHILD訊號,或者捕捉它,或者wait它派生的子程序,或者父程序先終止,這時子程序的終止自動由init程序來接管)

kill - 根據PID殺死程序

  • kill -9:強制殺死程序
  • kill -15:正常退出程序
  • kill -19:暫停程序
  • kill -18:恢復程序
# 安裝vsftpd
[root@localhost ~]# yum install vsftpd -y

# 啟動vsftpd
[root@localhost ~]# systemctl start vsftpd


# 檢視vsftp程序資訊
[root@localhost ~]# ps aux|grep vsftpd
root      20249  0.0  0.0  53288   576 ?        Ss   11:22   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root      20251  0.0  0.0 112812   968 pts/0    S+   11:23   0:00 grep --color=auto vsftpd


# 傳送過載訊號,例如:vsftpd 的配置檔案發生改變,希望重新載入
[root@localhost ~]# kill -1 20249


# 傳送停止訊號,當然vsftpd 服務有停止的指令碼 systemctl stop vsftpd
[root@localhost ~]# kill 20249


# 傳送強制停止訊號,當無法停止服務時,可強制終止訊號
[root@localhost ~]# kill -9 20249

killall、pkill - 根據名字殺死程序

可以使用kill命令殺死指定程序PID的程序

如果要找到我們需要殺死的程序,我們還需要在之前使用ps等命令再配合grep來查詢程序

而killall、pkill把這兩個過程合二為一,是一個很好用的命令

# 根據服務名稱殺死程序
[root@localhost ~]# pkill nginx
[root@localhost ~]# killall nginx
檢視某個使用者開啟的程序
pgrep -l -u 使用者名稱

3.關於HUP訊號

在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊
當用戶 logout 時,modem 就會結束通話(hang up)電話
同理:當 modem 斷開連線時,就會給終端傳送 hangup 訊號來通知其關閉所有子程序

當用戶登出(logout)或者網路斷開或者終端關閉(注意:一定是終端整體關閉,不是單純的exit)時

終端都會收到Linux HUP訊號(hangup)訊號,然後終端在結束前會關 閉其所有子程序

如果我們想讓我們的程序在後臺一直執行,不要因為使用者登出(logout)或者網路斷開或者終端關閉 而一起被關閉,那麼我們有2種解決方案

  • 方案1:讓程序忽略Linux HUP訊號
  • 方案2:讓程序執行在新的會話裡,從而成為不屬於此終端的子程序,就不會在當前終端掛掉的情 況下一起被帶走

① nohup命令

針對方案1,我們可以使用nohup命令,nohup 的用途就是讓提交的命令忽略 hangup 訊號,該命令 通常與&符號一起使用

nohup 的使用是十分方便的,只需在要處理的命令前加上 nohup 即可
但是 nohup 命令會從終端解除程序的關聯,程序會丟掉STDOUT,STDERR的連結
標準輸出和標準錯誤預設會被重定向到 nohup.out 檔案中
一般我們可在結尾加上"&"來將命令同時放入後臺執行,也可用">filename 2>&1"來更改預設的重定向檔名

② setsid命令

針對方案1,我們還可以用setsid命令實現,原理與nohup命令是一樣的

setid是直接將程序的父pid設定成 1,即讓執行的程序歸屬於init的子程序

那麼除非init結束,該子程序才會結束,當前程序所在的終端 結束後並不會影響程序的執行

# (終端1)
[darker@localhost ~]$ setsid ping www.baidu.com
[darker@localhost ~]$ PING www.baidu.com (112.80.248.75) 56(84) bytes of data.
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=1 ttl=128 time=10.6 ms
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=2 ttl=128 time=10.3 ms
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=3 ttl=128 time=10.4 ms
...


# (終端2)
[root@localhost ~]# ps -ef | grep [p]ing
darker    20369      1  0 11:58 ?        00:00:00 ping www.baidu.com

③ 在子shell中提交任務

# (終端1)
[darker@localhost ~]$  (ping www.baidu.com &)


# (終端2)
[root@localhost ~]# ps -ef | grep [p]ing
darker    20369      1  0 11:58 ?        00:00:00 ping www.baidu.com

可以看到新提交的程序的父 ID(PPID)為1(init 程序的 PID),並不是當前終端的程序 ID

因此並不 屬於當前終端的子程序,從而也就不會受到當前終端的Linux HUP訊號的影響了

④ screen命令

安裝screen
[root@localhost ~]# yum install screen -y
方式1:開啟一個視窗並用-S指定視窗名,也可以不指定
Screen將建立一個執行shell的視窗。你可以執行任意shell程式,就像在ssh視窗中那樣
在該視窗中鍵入exit則退出該視窗,如果此時,這是該screen會話的唯一視窗,該screen會話退出,否則screen自動切換到前一個視窗
[root@localhost ~]# screen -S darker

方式2:Screen命令後跟執行的命令

Screen建立一個執行vim test.txt的單視窗會話,退出vim將退出該視窗/會話

[root@localhost ~]# screen vim 1.txt
i
:wq

原理分析

screen程式會幫我們管理執行的命令

退出screen,我們的命令還會繼續執行

若關閉screen所在的終端,則screen程式的ppid變為1

所以screen不會死掉,對應著它幫我們管理的命令也不會退出測試

重新連線會話
# (終端1)
[root@localhost ~]# screen -S darker

n=1;while true;do echo $n;sleep 1;((n++));done

按下ctrl+a,然後再按下ctrl+d,注意要連貫 手要快

此時可以關閉整個終端,我們的程式並不會結束




# (終端2)
[root@localhost ~]# screen -ls
There is a screen on:
        15443.darker    (Detached)
1 Socket in /var/run/screen/S-root.

# 重新開啟之前的screen了
[root@localhost ~]# screen -r darker
瞭解

screen傳送命令使用了特殊的鍵組合Ctrl-a

這是因為我們在鍵盤上鍵入的資訊是直接傳送給當前screen視窗,必須用其他方式向screen視窗管理器發出命令

預設情況下,screen接收以C-a開始的命令

這種命令形式在screen中叫做鍵繫結(key binding)

可以通過C-a ?來檢視所有的鍵繫結,常用的鍵繫結有

組合鍵作用
Ctrl + a + ? 顯示所有鍵繫結資訊
Ctrl + a + w 顯示所有視窗列表
Ctrl + a Ctrl + a 切換到之前顯示的視窗
Ctrl + a + c 建立一個新的執行shell的視窗並切換到該視窗
Ctrl + a + n 切換到下一個視窗
Ctrl + a + p 切換到前一個視窗(與Ctrl+a+n相對
Ctrl + a + 0..9 切換到視窗0..9
Ctrl+a Ctrl+a傳送Ctrl+a到當前視窗
Ctrl + a + d 暫時斷開screen會話
Ctrl + a + k 殺掉當前視窗
Ctrl + a + [ 進入拷貝/回滾模式
Screen常用引數選項
選項作用
-c file 使用配置檔案file,而不使用預設的$HOME/.screenrc
不開啟新的screen會話,而是斷開其他正在執行的screen會話
-h num 指定歷史回滾緩衝區大小為num行
列出現有screen會話,格式為pid.tty.host
-d -m 啟動一個開始就處於斷開模式的會話
-r [pid.tty.host] 重新連線一個斷開的會話
-S sessionname 建立screen會話時為會話指定一個名字
-v 顯示screen版本資訊
-wipe [match] 同-list,但刪掉那些無法連線的會話
-x 會話共享演示

四:檢視網路狀態

netstat

選項釋義
-t TCP協議
-u UDP協議
-l Listen 監聽
-p PID / Program name 程式名
-n 不反解,不將IP地址解析為主機名,不將埠號解析成協議名(80 -> http)

# netstat需要先安裝net-tools
[root@localhost ~]# yum install net-tools -y


# 檢視正在監聽的,且使用tcp協議的程序
[root@localhost ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      914/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1007/master
tcp6       0      0 :::22                   :::*                    LISTEN      914/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1007/master



# 監聽22埠
[root@localhost ~]# netstat -an |grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 192.168.50.101:22       192.168.50.1:64684      ESTABLISHED
tcp        0      0 192.168.50.101:22       192.168.50.1:64678      ESTABLISHED
tcp        0     36 192.168.50.101:22       192.168.50.1:64662      ESTABLISHED
tcp        0      0 192.168.50.101:22       192.168.50.1:64733      ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN

五:proc檔案系統

簡介

/proc檔案系統是一個虛擬檔案系統

通過它可以使用一種新的方法在 Linux核心空間和使用者間之間進行通訊

/proc檔案系統中,我們可以將對虛擬檔案的讀寫作為與核心中實體進行通訊的一種手段,但是與普通檔案不同的是,這些虛擬檔案的內容都是動態建立的

cmdline:系統啟動時輸入給核心命令列引數
cpuinfo:CPU的硬體資訊 (型號, 家族, 快取大小等)
devices:主裝置號及裝置組的列表,當前載入的各種裝置(塊裝置/字元裝置)
dma:使用的DMA通道
filesystems:當前核心支援的檔案系統,當沒有給 mount(1) 指明哪個檔案系統的時候, mount(1) 就依靠該檔案遍歷不同的檔案系統
interrupts :中斷的使用及觸發次數,除錯中斷時很有用
ioports I/O:當前在用的已註冊 I/O 埠範圍
kcore:該偽檔案以 core 檔案格式給出了系統的實體記憶體映象(比較有用),可以用 GDB 查探當前核心的任意資料結構。該檔案的總長度是實體記憶體 (RAM) 的大小再加上 4KB
kmsg:可以用該檔案取代系統呼叫 syslog(2) 來記錄核心日誌資訊,對應dmesg命令
kallsym:核心符號表,該檔案儲存了核心輸出的符號定義, modules(X)使用該檔案動態地連線和捆綁可裝載的模組
loadavg:負載均衡,平均負載數給出了在過去的 15,、15 分鐘裡在執行佇列裡的任務數、總作業數以及正在執行的作業總數。
locks:核心鎖
meminfo實體記憶體、交換空間等的資訊,系統記憶體佔用情況,對應df命令
misc:雜項
modules:已經載入的模組列表,對應lsmod命令
mounts:已載入的檔案系統的列表,對應mount命令,無引數
partitions:系統識別的分割槽表
slabinfo:sla池資訊
stat:全面統計狀態表,CPU記憶體的利用率等都是從這裡提取資料。對應ps命令
swaps:對換空間的利用情況
version:指明瞭當前正在執行的核心版本
# 對/proc目錄下每一個目錄和檔案的大小分別進行彙總
[root@localhost ~]# du -sh /proc/*
0       /proc/1
0       /proc/10
0       /proc/1007
...

檢視例項

CPU相關:/proc/cpuinfo

# 檢視邏輯CPU的個數
[root@localhost ~]# grep 'processor' /proc/cpuinfo
processor       : 0
processor       : 1


# 檢視物理CPU的個數
[root@localhost ~]# grep 'processor id' /proc/cpuinfo


# 檢視CPU核數
[root@localhost ~]# grep 'cpu cores' /proc/cpuinfo
cpu cores       : 2
cpu cores       : 2
[root@localhost ~]#


# 檢視CPU詳情資訊
[root@localhost ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 165
model name      : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping        : 2
microcode       : 0xc8
cpu MHz         : 2304.000
cache size      : 16384 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat pku ospke md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 4608.00
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 165
model name      : Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
stepping        : 2
microcode       : 0xc8
cpu MHz         : 2304.000
cache size      : 16384 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat pku ospke md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities
bogomips        : 4608.00
clflush size    : 64
cache_alignment : 64
address sizes   : 45 bits physical, 48 bits virtual
power management:


# 簡單檢視CPU資訊
[root@localhost ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 165
Model name:            Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
Stepping:              2
CPU MHz:               2304.000
BogoMIPS:              4608.00
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              16384K
NUMA node0 CPU(s):     0,1
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat pku ospke md_clear spec_ctrl intel_stibp flush_l1d arch_capabilities

記憶體相關:/proc/meminfo

[root@localhost ~]# less /proc/meminfo
less /proc/meminfo
MemTotal:         995696 kB
MemFree:          496584 kB
MemAvailable:     663736 kB
Buffers:            2108 kB
Cached:           277848 kB
SwapCached:            0 kB
Active:           211844 kB
Inactive:         126460 kB
Active(anon):      58892 kB
Inactive(anon):     7356 kB
Active(file):     152952 kB
Inactive(file):   119104 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                16 kB
Writeback:             0 kB
AnonPages:         58364 kB
Mapped:            23720 kB
Shmem:              7880 kB
Slab:              86732 kB
SReclaimable:      45592 kB


[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         169         484           7         318         648
Swap:          2047           0        2047

核心啟動引數:/proc/cmdline

[root@localhost ~]# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-1160.6.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8


[root@localhost ~]# uptime
 15:49:03 up  3:46,  4 users,  load average: 0.12, 0.05, 0.05

注意:解除安裝/proc後,以下命令都無法使用

  • free -m
  • uptime
  • lscpu
  • toop
# 取消掛載
[root@localhost ~]# umount /proc -l


# 下面的命令都無法使用了
[root@localhost ~]# free -m
Error: /proc must be mounted
  To mount /proc at boot you need an /etc/fstab line like:
      proc   /proc   proc    defaults
  In the meantime, run "mount proc /proc -t proc"
[root@localhost ~]# uptime
Error: /proc must be mounted
  To mount /proc at boot you need an /etc/fstab line like:
      proc   /proc   proc    defaults
  In the meantime, run "mount proc /proc -t proc"
[root@localhost ~]# lscpu
lscpu: cannot open /proc/cpuinfo: No such file or directory
重新掛載之後
掛載引數描述
-t proc 指定檔案系統的型別
proc 檔案系統,虛擬檔案系統
/proc 掛載點
# 掛載
[root@localhost ~]# mount -t proc proc /proc/
[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            972         169         483           7         319         647
Swap:          2047           0        2047
[root@localhost ~]# uptime
 15:54:29 up  3:51,  4 users,  load average: 0.08, 0.08, 0.06
[root@localhost ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 165
Model name:            Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz

六:管理後臺程序

1.什麼是後臺程序?

通常程序都會在終端前臺執行,一旦關閉終端,程序也會隨著結束

那麼此時我們就希望程序能在後臺執行,就是將在前臺執行的程序放入後臺執行

這樣及時我們關閉了終端也不影響程序的正常執行

2.為何要講程序放入後臺執行?

比如:我們此前在國內伺服器往國外伺服器傳輸大檔案時,由於網路的問題需要傳輸很久

如果在傳輸的過程中出現網路抖動或者不小心關閉了終端則會導致傳輸失敗

如果能將傳輸的程序放入後臺,就能解決此類問題了

3.將程序放入後臺的工具

早期的時候大家都選擇使用&符號將程序放入後臺,然後再使用jobs、bg、fg等方式檢視程序狀態,但太麻煩了 也不直觀,所以推薦使用screen

① .jobs、bg、fg的使用(強烈不推薦,瞭解即可)

# 執行程式,讓它在後臺執行
[root@localhost ~]# sleep 6000 &
[1] 1036

# 將前臺的程式掛起(暫停)到後臺
[root@localhost ~]# sleep 7000
^Z    # 按:Ctrl + Z
[2]+  Stopped                 sleep 7000


# 檢視後臺任務
[root@localhost ~]# jobs
[1]-  Running                 sleep 6000 &
[2]+  Stopped                 sleep 7000


# 讓任務2 在後臺執行
[root@localhost ~]# bg %2
[2]+ sleep 7000 &


# 讓任務1 調回到前臺
[root@localhost ~]# fg %1
sleep 6000


# 程序在後臺執行,但輸出依然在當前終端
[root@localhost ~]# (while :; do date; sleep 2; done)

② screen的使用(強烈推薦!!!)

詳情見:三:3.④

七:管道

1.什麼是管道

管道是一種通訊機制,通常用於程序間的通訊(也可通過socket進行網路通訊),它表現出來的形式將前面每一個程序的輸出(stdout)直接作為下一個程序的輸入(stdin)
詳細地說,管道操作符號|,主要用來連線左右兩個命令, 將左側的命令的標準輸出, 交給右側命令的 標準輸入
簡而言之,就是把前一條命令的結果 作為引數 傳給後一條命令(這個過程有點像資料庫的查詢)

格式:命令1|命令2|命令3|命令...

2.管道命令僅能處理standard output,對於standard error output會予以忽略

  • lessmoreheadtail都是可以接收standard input的命令,所以他們是管道命令
  • lscpmv並不會接收standard input的命令,所以他們就不是管道命令了

3.管道流程示意圖

4.管道應用示例

# 統計當前/etc/passwd中使用者使用的shell型別
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd | sort | uniq -c
      7 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     18 /sbin/nologin
      1 /sbin/shutdown
      
      
# 統計網站的訪問情況(如果有的話)
[root@localhost ~]# netstat -an | grep :80 | awk -F":" '{print $8}'| sort | uniq -c


# 列印/dev下帶有usb的目錄
[root@localhost ~]# ls -l /dev | grep 'usb'
crw-------. 1 root root    247,   0 Nov 28  2020 usbmon0
crw-------. 1 root root    247,   1 Nov 28  2020 usbmon1
crw-------. 1 root root    247,   2 Nov 28  2020 usbmon2
crw-------. 1 root root    247,   3 Nov 28  2020 usbmon3
crw-------. 1 root root    247,   4 Nov 28  2020 usbmon4

5.選取命令:cut、grep

cut:從某一行資訊中取出某部分我們想要的資訊

語法
cut -d '分隔字元' -f field // 用於分隔字元
cut -c 字元範圍

選項
選項釋義
-d 後面接分隔字元,通常與-f一起使用
-f 根據-d將資訊分隔成數段,-f後接數字 表示取出第幾段
-c 以字元為單位取出固定字元區間的資訊
例項
# 列印/etc/passwd檔案中以:為分隔符的第1個欄位和第6個欄位分別表示使用者名稱和家目錄
[root@localhost ~]# cat /etc/passwd | cut -d ':' -f 1,6
root:/root
bin:/bin
daemon:/sbin
...


# 列印/etc/passwd檔案中每一行的前10個字元:
[root@localhost ~]# cat /etc/passwd | cut -c 1-10
root:x:0:0
bin:x:1:1:
daemon:x:2
...

cut在處理多空格相連的資料時,比較吃力

grep:分析一行資訊,如果其中有我們需要的資訊,就將該行拿出來(模糊匹配/包含)

語法
grep [-acinv] [--color=auto] '查詢字串' filename
選項
選項釋義
-a binary檔案text檔案的方式查詢資料
-c 計算找到 '查詢字串'的次數
-i 忽略大小寫的不同
-n 輸出行數
-v 反向選擇,顯示沒有查詢內容的行
--color=auto 將找到的關鍵字部分加上顏色顯示(其實...不加也可以關鍵字高亮...)
例項
# 取出/etc/passwd目錄中 包含user的行
[root@localhost ~]# cat /etc/passwd | grep -n 'user'
19:tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
26:user01:x:2021:2021::/home/user01:/bin/bash
27:user02:x:2022:2022::/home/user02:/bin/bash


 # 統計/etc/passwd目錄中 包含user的行數
 [root@localhost ~]# cat /etc/passwd | grep -n -c 'user'
3


# 取出/etc/passwd目錄中 不包含user的行
[root@localhost ~]# cat /etc/passwd | grep -n -v 'user'
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


# 統計/etc/passwd目錄中 不包含user的行數
[root@localhost ~]# cat /etc/passwd | grep -n -v -c 'user'
25

4.排序命令:sortwcuniq

sort:排序

語法
sort [-fbMnrtuk] [file or stdin]

選項
選項釋義
-f 忽略大小寫的差異,例如 A 與a 視為編碼相同
-b 忽略最前面的空格部分
-M 以月份的名字來排序,例如JAN, DEC 等等的排序方法
-n 使用『純數字』進行排序預設是以文字型態來排序的
-r 反向排序
-u 就是uniq ,相同的資料中,僅出現一行代表
-t 分隔符號,預設是用[tab] 鍵來分隔
-k 以哪個區間(field) 來進行排序的意思
例項
# 對 /etc/passwd的賬號進行排序(預設以第1個欄位為引數)
[root@localhost ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
ben:x:1001:1001::/home/ben:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
darker:x:1000:1000::/home/darker:/bin/bash
dbus:x:81:81:System message bus:/:/sbin/nologin
eve:x:1002:1002::/home/eve:/bin/bash


# 通過/etc/passwd 第5列來進行排序
[root@localhost ~]# cat /etc/passwd | sort -t ':' -k 5
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
...

uniq:去重

語法
uniq [-ic]
選項
選項釋義
-i 忽略大小寫的不同
-c 進行計數
例項
# 使用 last 取出歷史登入資訊的賬號,排序,去重
[root@localhost ~]# last | cut -d ' ' -f 1 | sort | uniq -c
      1
      5 darker
      1 nancy
     12 reboot
     31 root
      1 wtmp

wc:統計

語法
wc [-lwm]
選項
選項釋義
-l 僅列出行
-w 僅列出多少字(英文單字)
-m 多少字元
例項
# 檢視etc/passwd中有多少賬號
[root@localhost ~]# cat /etc/passwd | wc -l
28


# 計算最近登入系統的人次
[root@localhost ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
49


# 檢視某個檔案的行數 字數 字元數
[root@localhost ~]# cat /etc/passwd | wc
     28      50    1320

5.雙向重定向命令:tee

在資料流的處理過程中將某段資訊儲存下來,使其 既能輸出到螢幕 又能儲存到某一個檔案中

語法

tee [-a] file
選項
選項釋義
-a 以累加的方式,將資料加入file中
例項
# 先檢視當前目錄的資訊(空空如也)
[root@localhost ~]# ls -l
total 0


# 查詢最近使用者登入情況(螢幕只顯示第一段內容),並將其儲存到檔案:info.txt中
[root@localhost ~]# last | tee info.txt | cut -d ' ' -f 1
root
reboot
root
...


# 再次先檢視當前目錄的資訊(產生了info.txt檔案)
[root@localhost ~]# ls -l
total 4
-rw-r--r--. 1 root root 3811 Nov 27 20:52 info.txt


# 檢視info.txt
[root@localhost ~]# last | tee info.txt | cut -d ' ' -f 1
root     pts/0        192.168.50.1     Sat Nov 28 00:15   still logged in
reboot   system boot  3.10.0-1160.6.1. Sat Nov 28 00:15 - 20:52  (-3:-23)
root     pts/1        192.168.50.1     Fri Nov 27 12:20 - down   (03:55)
root     pts/9        192.168.50.1     Fri Nov 27 12:07 - down   (04:08)
root     pts/8        192.168.50.1     Fri Nov 27 12:07 - down   (04:08)
root     pts/7        192.168.50.1     Fri Nov 27 12:06 - 12:07  (00:01)
...

如果檔案已存在 就會覆蓋,不存在 則會建立

加上-a引數則會累加

6.xargs引數傳遞

主要讓一些不支援管道的命令可以使用管道技術

# 查詢cat所在的目錄,顯示詳情資訊
[root@localhost ~]# which cat | xargs ls -l
-rwxr-xr-x. 1 root root 54080 Nov 17 06:24 /usr/bin/cat


# 顯示之前刪除了哪些檔案
[root@localhost ~]# ls | xargs rm -fv
removed ‘anaconda-ks.cfg’
removed ‘info.txt’