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.用top
或ps
命令檢視程序的優先順序
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狀態的程序
無論是kill
、kill-9
、kill-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..9Ctrl+a Ctrl+a 傳送Ctrl+a 到當前視窗 |
Ctrl + a + d | 暫時斷開screen會話 |
Ctrl + a + k | 殺掉當前視窗 |
Ctrl + a + [ | 進入拷貝/回滾模式 |
Screen常用引數選項
四:檢視網路狀態
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:負載均衡,平均負載數給出了在過去的 1、 5,、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
會予以忽略
less
、more
、head
、tail
都是可以接收standard input的命令,所以他們是管道命令ls
、cp
、mv
並不會接收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.排序命令:sort
、wc
、uniq
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’