進程與系統性能
一、進程相關概念
1.進程概念
(1)內核功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等
(2)Process: 運行中的程序的一個副本,是被載入內存的一個指令集合
進程ID(Process ID,PID)號碼被用來標記各個進程
UID、GID、和SELinux語境決定對文件系統的存取和訪問權限
通常從執行進程的用戶來繼承
存在生命週期
(3)task struct:Linux內核存儲進程信息的數據結構格式
(3)task list:多個任務的的task struct組成的鏈表
(4)進程創建:
init:第一個進程(centos6)
systemd:第一個進程(centos7)
進程:都由其父進程創建,父子關係,CoW
fork(), clone()
(5)Page Frame: 頁框,用存儲頁面數據,存儲Page 4k
(6)物理地址空間和線性地址空間
(7)MMU:Memory Management Unit 負責轉換線性和物理地址
(8)TLB:Translation Lookaside Buffer 翻譯後備緩衝器,用於保存虛擬地址和物理地址映射關係的緩存
(9)LRU:Least Recently Used 近期最少使用算法,釋放內存
LRU算法
進程,線程和協程
用戶和內核空間
2.進程的基本狀態和轉換
進程的基本狀態和轉換
進程的基本狀態
(1)創建狀態:進程在創建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫控制和管理進程的信息,
完成資源分配。如果創建工作無法完成,比如資源無法滿足,就無法被調度運行,把此時進程所處狀態稱爲創建狀態
(2)就緒狀態:進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
(3)執行狀態:進程處於就緒狀態被調度後,進程進入執行狀態
(4)阻塞狀態:正在執行的進程由於某些事件(I/O請求,申請緩存區失敗)而暫時無法運行,進程受到阻塞。
在滿足請求時進入就緒狀態等待系統調用
(5)終止狀態:進程結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行
狀態之間轉換六種情況
(1)運行——>就緒:1,主要是進程佔用CPU的時間過長,而系統分配給該進程佔用CPU的時間是有限的;
2,在採用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行時,該進程就被迫讓出CPU,該進程便由執行狀態轉變爲就緒狀態
(2)就緒——>運行:運行的進程的時間片用完,調度就轉到就緒隊列中選擇合適的進程分配CPU
(3)運行——>阻塞:正在執行的進程因發生某等待事件而無法執行,則進程由執行狀態變爲阻塞狀態,如發生了I/O請求
(4)阻塞——>就緒:進程所等待的事件已經發生,就進入就緒隊列
(5)以下兩種狀態是不可能發生的:
(5.1)阻塞——>運行:即使給阻塞進程分配CPU,也無法執行,操作系統在進行調度時不會從阻塞隊列進行挑選,而是從就緒隊列中選取
(5.2)就緒——>阻塞:就緒態根本就沒有執行,談不上進入阻塞態
3.IPC進程間通信
IPC: Inter Process Communication
同一主機:pipe 管道
socket 套接字文件
signal 信號
shm shared memory
semaphore 信號量,一種計數器
不同主機:socket IP和端口號
RPC remote procedure call
MQ 消息隊列,如:Kafka,RabbitMQ,ActiveMQ
4.進程優先級
進程優先級:
系統優先級:數字越小,優先級越高
0-139:各有140個運行隊列和過期隊列
實時優先級: 99-0 值最大優先級最高
nice值:-20到19,對應系統優先級100-139
Big O:時間複雜度,用時和規模的關係
O(1), O(logn), O(n)線性, O(n^2)拋物線, O(2^n)
5.進程狀態
Linux內核:搶佔式多任務
進程類型:
守護進程: daemon,在系統引導過程中啓動的進程,和終端無關進程
前臺進程:跟終端相關,通過終端啓動的進程
注意:兩者可相互轉化
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停於內存,但不會被調度,除非手動啓動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉
二、進程與系統性能
1.系統管理工具
進程的分類:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop,glance,
pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
2.進程管理
1.pstree命令
pstree命令
pstree [選項] [PID或用戶名]
pstree 命令是以樹形結構顯示程序和進程之間的關係
-a 顯示啓動每個進程對應的完整指令,包括啓動進程的路徑、參數等。
-c 不使用精簡法顯示進程信息,即顯示的進程中包含子進程和父進程。
-n 根據進程 PID 號來排序輸出,默認是以程序名排序輸出的。
-p 顯示進程的 PID。
-u 顯示進程對應的用戶名稱。
2.ps命令
ps命令-->process state
ps report a snapshot of the current processes
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中
ps [OPTION]...
支持三種選項:
UNIX選項 如-A -e
BSD選項 如a
GNU選項 如--help
UNIX選項:
-C cmdlist 指定命令,多個命令用,分隔
-L 顯示線程
-e: 顯示所有進程,相當於-A
-f: 顯示完整格式程序信息
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息
-u userlist 指定有效的用戶ID或名稱
-U userlist 指定真正的用戶ID或名稱
-g gid或groupname 指定有效的gid或組名稱
-G gid或groupname 指定真正的gid或組名稱
-p pid 顯示指pid的進程
--ppid pid 顯示屬於pid的子進程
-M 顯示SELinux信息,相當於Z
BSD選項:
默認顯示當前終端中的進程
a 選項包括所有終端中的進程
x 選項包括不鏈接終端的進程
u 選項顯示進程所有者的信息
f 選項顯示進程樹,相當於 --forest
k|--sort 屬性 對屬性排序,屬性前加- 表示倒序
o 屬性… 選項顯示定製的信息 pid、cmd、%cpu、%mem
L 顯示支持的屬性列表
ps輸出屬性
VSZ: Virtual memory SiZe,虛擬內存集,線性內存
RSS: ReSident Size, 常駐內存集
STAT:進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
L:內存分頁並帶鎖
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者
ni: nice值
pri: priority 優先級
psr: processor CPU編號
rtprio: 實時優先級
示例:
ps axo pid,cmd,psr,ni,pri,rtprio
常用組合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
例子:
1)查詢你擁有的所有進程
ps -x
2)顯示指定用戶名(RUID)或用戶ID的進程
ps -fU apache
ps -fU 48
3)顯示指定用戶名(EUID)或用戶ID的進程
ps -fu wang
ps -fu 1000
4)查看以root用戶權限(實際和有效ID)運行的每個進程
ps -U root -u root
5)列出某個組擁有的所有進程(實際組ID:RGID或名稱)
ps -fG nginx
6)列出有效組名稱(或會話)所擁有的所有進程
ps -fg mysql
ps -fg 27
7)顯示指定的進程ID對應的進程
ps -fp 1234
8)以父進程ID來顯示其下所有的進程,如顯示父進程爲1234的所有進程
ps -f --ppid 1234
9)顯示指定PID的多個進程
ps -fp 1204,1239,1263
10)要按tty顯示所屬進程
ps -ft pts/0
11)以進程樹顯示系統中的進程如何相互鏈接
ps -e --forest
12)以進程樹顯示指定的進程
ps -f --forest -C sshd
ps -ef --forest | grep -v grep | grep sshd
13)要顯示一個進程的所有線程,將顯示LWP(輕量級進程)以及NLWP(輕量級進程數)列
ps -fL -C nginx
14)要列出所有格式說明符
ps L
15)查看進程的PID,PPID,用戶名和命令
ps -eo pid,ppid,user,cmd
16)自定義格式顯示文件系統組,ni值開始時間和進程的時間
ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime
17)使用其PID查找進程名稱:
ps -p 1244 -o comm=
18)要以其名稱選擇特定進程,顯示其所有子進程
ps -C sshd,bash
19)查找指定進程名所有的所屬PID,在編寫需要從std輸出或文件讀取PID的腳本時這個參數很有用
ps -C httpd,sshd -o pid=
20)檢查一個進程的執行時間
ps -eo comm,etime,user | grep nginx
21)查找佔用最多內存和CPU的進程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
22)顯示安全信息
ps -eM
ps --context
23)使用以下命令以用戶定義的格式顯示安全信息
ps -eo euser,ruser,suser,fuser,f,comm,label
24)使用watch實用程序執行重複的輸出以實現對就程進行實時的監視,如下面的命令顯示每秒鐘的監視
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
搜索進程:
最靈活:ps 選項 | 其它命令
進程優先級調整:
靜態優先級:100-139
進程默認啓動時的nice值爲0,優先級爲120
只有根用戶才能降低nice值(提高優先性)
查看:
ps axo pid,comm,ni
3.nice命令
nice命令
Linux nice命令以更改過的優先序來執行程序,如果未指定程序,則會印出目前的排程優先序,內定的 adjustment 爲 10,範圍爲 -20(最高優先序)到 19(最低優先序)。
nice [OPTION] [COMMAND [ARG]...]
例子:
(1)實例
1)後臺運行vi
vi &
2)設置默認優先級
nice vi &
3)設置優先級爲19
nice -n 19 vi &
4)設置優先級爲 -20
nice -n -20 vi &
5)顯示進程
ps -l
(2)將 ls 的優先序加 1 並執行
nice -n 1 ls
(3)將 ls 的優先序加 10 並執行
nice ls
4.renice命令
renice命令
Linux renice命令用於重新指定一個或多個行程(Process)的優先序(一個或多個將根據參數而定)。
注意:每一個行程(Process)都有一個唯一的(unique)id。
使用權限:所有使用者。
renice [-n] priority pid...
-p pid 重新指定行程的 id 爲 pid 的行程的優先序
-g pgrp 重新指定行程羣組(process group)的 id 爲 pgrp 的行程 (一個或多個) 的優先序
-u user 重新指定行程擁有者爲 user 的行程的優先序
例子:
1)將行程 id 爲 987 及 32 的行程與行程擁有者爲 daemon 及 root 的優先序號碼加 1
renice +1 987 -u daemon root -p 32
5.pgrep命令
pgrep命令
經常要查看進程的信息,包括進程的是否已經消亡,通過pgrep來獲得正在被調度的進程的相關信息。
pgrep通過匹配其程序名,找到匹配的進程。
pgrep [options] pattern
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示指定進程的子進程
6.pidof命令
pidof命令
pidof命令 用於查找指定名稱的進程的進程號id號。
pidof [選項] [參數]
-s:僅返回一個進程號;
-c:僅顯示具有相同“root”目錄的進程;
-x:顯示由腳本開啓的進程;
-o:指定不顯示的進程ID。
3.系統資源管理
1.uptime和w命令
(1)顯示當前時間,系統已啓動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)
(2)系統平均負載:指在特定時間間隔內運行隊列中的平均進程數
(3)通常每個CPU內核的當前活動進程數不大於3,那麼系統的性能良好。如果每個CPU內核的任務數大於5,那麼此主機的性能有嚴重問題
(4)如果linux主機是1個雙核CPU,當Load Average 爲6的時候說明機器已經被充分使用
[root@centos7 ~]#uptime
15:23:49 up 19 min, 2 users, load average: 0.00, 0.01, 0.05
[root@centos7 ~]#w
15:26:20 up 21 min, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.7.1 15:09 4.00s 0.09s 0.00s w
root pts/1 10.0.7.1 15:09 4:52 0.36s 0.02s bash
補充:
/proc/uptime 包括兩個值,單位 s 系統啓動時長,空閒進程的總時長(按總的CPU核數計算)
2.top命令
top:有許多內置命令
排序:
P:以佔據的CPU百分比,%CPU
M:佔據內存百分比,%MEM
T:累積佔據CPU時長,TIME+
首部信息顯示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分別顯示:1 (數字)
memory信息:m命令
退出命令:q
修改刷新時間間隔:s
終止指定進程:k
保存文件:W
欄位信息簡介
us:用戶空間
sy:內核空間
ni:調整nice時間
id:空閒
wa:等待IO時間
hi:硬中斷
si:軟中斷(模式切換)
st:虛擬機偷走的時間
選項:
-d # 指定刷新時間間隔,默認爲3秒
-b 全部顯示所有進程
-n # 刷新多少次後退出
-H 線程模式,示例:top -H -p `pidof mysqld`
3.htop命令
htop命令:EPEL源
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序
子命令:
s:跟蹤選定進程的系統調用
l:顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t:顯示進程樹
4.glances命令
glances命令:EPEL源
1.linux系統自帶了很多系統性能監控工具,如top,vmstat,iftop等等,還有一款監視工具glances,它能把其他幾個監控的指標都集於一身。
2.Glances是一個相對比較新的系統監控工具,用 Python 編寫的,使用 psutil 庫從系統獲取信息。
3.可以用它來監控 CPU、平均負載、內存、網絡接口、磁盤 I/O,文件系統空間利用率、掛載的設備、所有活動進程以及消耗資源最多的進程。
4.Glances 有很多有趣的選項。它的主要特性之一是可以在配置文件中設置閥值(careful小心、warning警告、critical致命),然後它會用不同顏色顯示信息以表明系統的瓶頸。
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
常用選項:
-b: 以Byte爲單位顯示網卡數據速率
-d: 關閉磁盤I/O模塊
-f /path/to/somefile: 設定輸入文件位置
-o {HTML|CSV}:輸出格式
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示
常用的快捷鍵
m : 按內存佔用排序進程
p : 按進程名稱排序進程
c : 按 CPU 佔用率排序進程
i : 按 I/O 頻率排序進程
a : 自動排序進程
d : 顯示/隱藏磁盤 I/O 統計信息
f : 顯示/隱藏文件系統統計信息
s : 顯示/隱藏傳感器統計信息
y : 顯示/隱藏硬盤溫度統計信息
l : 顯示/隱藏日誌
n : 顯示/隱藏網絡統計信息
x : 刪除警告和嚴重日誌
h : 顯示/隱藏幫助界面
q : 退出
w : 刪除警告記錄
C/S模式下運行glances命令
服務器模式:
glances -s -B IPADDR
IPADDR: 指明監聽的本機哪個地址
客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務器端地址
Connected to centos7.6 Uptime: 1:34:21
CPU [ 2.3%] CPU 2.3% MEM 18.2% SWAP 0.0% LOAD
MEM [ 18.2%] user: 0.0% total: 1.78G total: 8.00G 1 min:
SWAP [ 0.0%] system: 0.8% used: 333M used: 0 5 min:
idle: 97.8% free: 1.46G free: 8.00G 15 min:
NETWORK Rx/s Tx/s TASKS 400 (445 thr), 1 run, 399 slp, 0 oth
eth0 0b 0b
eth1 576b 1Kb CPU% MEM% PID USER NI S Command
lo 30Kb 30Kb 6.1 0.9 11238 root 1 R /usr/bin/
virbr0 0b 0b 1.8 1.2 11242 root 1 S /usr/bin/
_rbr0-nic 0b 0b 0.3 0.3 866 root 1 S /usr/bin/
0.3 0.0 137 root 1 S rcu_sched
DISK I/O R/s W/s 0.0 0.3 11203 root 1 S sshd: roo
sda1 0 0
2020-01-17 16:39:10 No warning or critical alert detected
5.dstat命令
dstat命令
(1)dstat 是一個可以取代vmstat,iostat,netstat和ifstat這些命令的多功能產品。dstat揚長避短,即克服了這些命令的侷限又增加了一些額外的功能,不但擁有更多的監控項,也更靈活。dstat在性能測試、基準測試和排除故障過程中可以很方便監控系統運行狀況。
(2)dstat可以查看所有的實時系統資源,如:通過統計IDE控制器當前狀態來比較磁盤利用率,或者直接通過網絡帶寬數值來比較磁盤的吞吐率(在相同的時間間隔內)。
(3)dstat以列表的形式提供選項信息,並清晰地告知以何種幅度和單位顯示輸出。輸出信息整潔,降低發生錯誤的概率。最重要的是,整潔的數據更容易編寫插件用來收集分析關注的數據信息。
(4)dstat默認輸出是專門爲實時查看而設計的,然而也可以將詳細信息通過cvs輸出到一個文件,然後將cvs文件導入到Gnumeric或者Excel中生成圖表。
特性
結合了vmstat,iostat,ifstat,netstat以及更多的信息
實時顯示統計情況,輸出報告
在分析和排障時可以通過啓用監控項並排序
模塊化設計
使用python編寫的,方便擴展現有的工作任務
容易擴展和添加你的計數器
包含的許多擴展插件——增加新的監控項目很方便
可以分組統計塊設備/網絡設備,並給出總數
可以顯示每臺設備的當前狀態
極準確的時間精度,即便是系統負荷較高也不會延遲顯示
顯示準確地單位和和限制轉換誤差範圍
不同的計量單位用不同的顏色顯示
顯示中間結果延時小於1秒
支持輸出CSV格式報表,並能導入到Gnumeric和Excel以生成圖形
針對默認輸出字段解釋如下:
分組 分組含義及子項字段含義
CPU狀態 CPU的使用率。顯示了用戶佔比,系統佔比、空閒佔比、等待佔比、硬中斷和軟中斷情況。
磁盤統計 磁盤的讀寫,分別顯示磁盤的讀、寫總數。
網絡統計 網絡設備發送和接受的數據,分別顯示的網絡收、發數據總數。
分頁統計 系統的分頁活動。分別顯示換入(in)和換出(out)。
系統統計 統計中斷(int)和上下文切換(csw)。
dstat [-afv] [options..] [delay [count]]
-c, --cpu 開啓cpu統計
-C 該選項跟cpu的編號(0~cpu核數-1,多個用都好隔開)如:0,3,total表示分別包含cpu0、cpu3和total
-d, --disk 開啓disk統計
-D 改選跟具體的設備名(多個用逗號隔開)如:total,hda,hdb表示分別統計total、hda、hdb設備塊
-g, --page 開啓分頁統計
-i, --int 開啓中斷統計
-I 5,10 沒弄懂呢~巴拉巴拉
-l, --load 開啓負載均衡統計,分別是1m,5m,15m
-m, --mem 開啓內存統計,包括used,buffers,cache,free
-n, --net 開啓net統計,包括接受和發送
-N 該選項可以跟網絡設備名多個用逗號隔開,如eth1,total
-p, --proc 開啓進程統計,包括runnable, uninterruptible, new
-r, --io io開啓請求統計,包括read requests, write requests
-s, --swap 開啓swap統計,包括used, free
-S 該選項可以跟具體的交換區,多個用逗號隔開如swap1,total
-t, --time 啓用時間和日期輸出
-T, --epoch 啓用時間計數,從epoch到現在的秒數
-y, --sys 開啓系統統計,包括中斷和上下文切換
--aio 開啓同步IO統計 (asynchronous I/O)
--fs 開啓文件系統統計,包括 (open files, inodes)
--ipc 開啓ipc統計,包括 (message queue, semaphores, shared memory)
--lock 開啓文件所統計,包括 (posix, flock, read, write)
--raw 開啓raw統計 (raw sockets)
--socket 開啓sockets統計,包括 (total, tcp, udp, raw, ip-fragments)
--tcp 開啓tcp統計,包括(listen, established, syn, time_wait, close)
--udp 開啓udp統計 (listen, active)
--unix 開啓unix統計(datagram, stream, listen, active)
--vm 開啓vm統計 (hard pagefaults, soft pagefaults, allocated, free)
--stat 通過插件名稱開啓插件擴展,詳見命令插件 :可能的內置插件爲aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold, sys, tcp, time,udp, unix, vm
--list 列舉內置插件擴展的名稱
-a, --all 是默認值相當於 -cdngy (default)
-f, --full 相當於 -C, -D, -I, -N and -S
-v, --vmstat 相當於 -pmgdsc -D total
--bw, --blackonwhite 在白色背景終端上改變顯示顏色
--float 在屏幕上的輸出強制顯示爲浮點值(即帶小數)(相反的選項設置爲 - -integer)
--integer 在屏幕上的輸出強制顯示爲整數值,此爲默認值(相反的選項設置爲- -float)
--nocolor 禁用顏色(意味着選項 - -noupdate)
--noheaders 禁止重複輸出header,默認會打印一屏幕輸出一次header
--noupdate 當delay>1時禁止在過程中更新(即在時間間隔內不允許更新)
--output file 輸出結果到cvs文件中
命令參數:
參數名稱 參數描述
delay 兩次輸出之間的時間間隔,默認是1s
count 報告輸出的次數,默認是沒有限制,一直輸出知道ctrl+c
命令插件
雖然anyone可以自由的爲dstat編寫插件,但dstat附帶大量的插件已經大大擴展其功能,下面是dstat附帶插件的一個概述:
--battery 電池電池百分比(需要ACPI)
--battery-remain 電池剩餘小時、分鐘(需要ACPI)
--cpufreq CPU頻率百分比(需要ACPI)
--dbus dbus連接的數量(需要python-dbus)
--disk-util 顯示某一時間磁盤的忙碌狀況
--fan 風扇轉速(需要ACPI)
--freespace 每個文件系統的磁盤使用情況
--gpfs gpfs 讀/寫 I / O(需要mmpmon)
--gpfs-ops GPFS文件系統操作(需要mmpmon)
--helloworld dstat插件Hello world示例
--innodb-buffer 顯示innodb緩衝區統計
--innodb-io 顯示innodb I / O統計數據
--innodb-ops 顯示innodb操作計數器
--lustre 顯示lustreI / O吞吐量
--memcache-hits 顯示memcache 的命中和未命中的數量
--mysql5-cmds 顯示MySQL5命令統計
--mysql5-conn 顯示MySQL5連接統計
--mysql5-io MySQL5 I / O統計數據
--mysql5-keys 顯示MySQL5關鍵字統計
--mysql-io 顯示MySQL I / O統計數據
--mysql-keys 顯示MySQL關鍵字統計
--net-packets 顯示接收和發送的數據包的數量
--nfs3 顯示NFS v3客戶端操作
--nfs3-ops 顯示擴展NFS v3客戶端操作
--nfsd3 顯示NFS v3服務器操作
--nfsd3-ops 顯示擴展NFS v3服務器操作
--ntp 顯示NTP服務器的ntp時間
--postfix 顯示後綴隊列大小(需要後綴)
--power 顯示電源使用量
--proc-count 顯示處理器的總數
--rpc 顯示rpc客戶端調用統計
--rpcd 顯示RPC服務器調用統計
--sendmail 顯示sendmail隊列大小(需要sendmail)
--snooze 顯示每秒運算次數
--test 顯示插件輸出
--thermal 熱系統的溫度傳感器
--top-bio 顯示消耗塊I/O最大的進程
--top-cpu 顯示消耗CPU最大的進程
--top-cputime 顯示使用CPU時間最大的進程(單位ms)
--top-cputime-avg 顯示使用CPU時間平均最大的進程(單位ms)
--top-io 顯示消耗I/O最大進程
--top-latency 顯示總延遲最大的進程(單位ms)
--top-latency-avg 顯示平均延時最大的進程(單位ms)
--top-mem 顯示使用內存最大的進程
--top-oom 顯示第一個被OOM結束的進程
--utmp 顯示utmp連接的數量(需要python-utmp)
--vmk-hba 顯示VMware ESX內核vmhba統計數
--vmk-int 顯示VMware ESX內核中斷數據
--vmk-nic 顯示VMware ESX內核端口統計
--vz-io 顯示每個OpenVZ請求CPU使用率
--vz-ubc 顯示OpenVZ用戶統計
--wifi 無線連接質量和信號噪聲比
常用插件
--disk-util 顯示某一時間磁盤的忙碌狀況
--freespace 顯示當前磁盤空間使用率
--proc-count 顯示正在運行的程序數量
--top-bio 顯示塊I/O最大的進程
--top-cpu 顯示CPU佔用最大的進程
--top-io 顯示正常I/O最大的進程
--top-mem 顯示佔用最多內存的進程
例子:
1)內存資源使用情況:
dstat -glms --top-mem
2)CPU資源使用情況:
dstat -cyl --proc-count --top-cpu
3)輸出一個csv文件:
dstat --output ~/test.csv
常見問題
1、cpu分組中”wait”,如果一直處於高使用率,那說明系統存在一些其它問題。當CPU的狀態處在”waits”時,那是因爲它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。
2、CPU的使用情況是否正常:用戶態和內核態的使用是否合理;總體佔比是否合理;若不合理可以用dstat對應的插件(- -top-cpu)排查最耗CPU的進程,配合mpstat、top再去下鑽一下分析線程,進一步到程序(比如java可以jstack)。
3、磁盤IO讀寫是否正常:讀寫是否偏大;若不正常可以配合插件- -disk-util、- -freespace、- -top-bio、- -top-io等進行排查,也可以配合iostat排查
3、內存是否正常:一般要配合交換區內存一起判斷,若不正常可以配合插件- -top-mem,可能是開啓的進程太多,或者第三方程序搗亂。
4、應用程序內存是否正常:配合業務表現比如請求響應慢、沒反應等,在結合第三方程序監控(如java可以用jvm監控工具(jprofiler、jconsole、jvisualvm……)監控內存)此種情況和3還不太一樣,一個jvm內存一個sys內存
5、分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值都是0。
6、系統統計僅在有比較基線時纔有意義。中斷和上下文切換較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。
7、使用不同的插件可以快速排查有問題的進程然後配合其他工具下鑽具體問題,當然這個需要建立在你對所有的插件都比較熟悉的基礎之上,知道什麼情況下使用什麼插件。技巧:可以將常用的命令寫成腳本,執行分析,這樣就不用每次都敲了
————————————————
版權聲明:本文爲CSDN博主「約會遠行」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yue530tomtom/article/details/75443305
6.lsof命令
lsof:list open files查看當前系統文件的工具。在linux環境下,一切皆文件,用戶通過文件不僅可以訪問常規數據,
還可以訪問網絡連接和硬件如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP)套接字等,系統在後臺都爲該應用程序分配了一個文件描述符
命令參數
-a:列出打開文件存在的進程
-c<進程名>:列出指定進程所打開的文件
-g:列出GID號進程詳情
-d<文件號>:列出佔用該文件號的進程
+d<目錄>:列出目錄下被打開的文件
+D<目錄>:遞歸列出目錄下被打開的文件
-n<目錄>:列出使用NFS的文件
-i<條件>:列出符合條件的進程(4、6、協議、:端口、 @ip )
-p<進程號>:列出指定進程號所打開的文件
-u:列出UID號進程詳情
-h:顯示幫助信息
-v:顯示版本信息。
-n: 不反向解析網絡名字
例子:
(1)進程管理
1)查看由登陸用戶啓動而非系統啓動的進程
lsof /dev/pts/1
2)指定進程號,可以查看該進程打開的文件
lsof -p 9527
(2)文件管理
1)查看指定程序打開的文件
lsof -c httpd
2)查看指定用戶打開的文件
lsof -u root | more
3)查看指定目錄下被打開的文件
lsof +D /var/log/
lsof +d /var/log/
參數+D爲遞歸列出目錄下被打開的文件,參數+d爲列出目錄下被打開的文件
(3)查看所有網絡連接
lsof -i –n
lsof -i@127.0.0.1
通過參數-i查看網絡連接的情況,包括連接的ip、端口等以及一些服務的連接情況,例如:sshd等。也可以通過指定ip查看該ip的網絡連接情況
(4)查看端口連接情況
lsof -i :80 -n
通過參數-i:端口可以查看端口的佔用情況,-i參數還有查看協議,ip的連接情況等
(5)查看指定進程打開的網絡連接
lsof -i –n -a -p 9527
參數-i、-a、-p等,-i查看網絡連接情況,-a查看存在的進程,-p指定進程
(6)查看指定狀態的網絡連接
lsof -n -P -i TCP -s TCP:ESTABLISHED
-n:no host names, -P:no port names,-i TCP指定協議,-s指定協議狀態通過多個參數可以清晰的查看網絡連接情況、協議連接情況等
(7)恢復刪除文件
lsof |grep /var/log/messages
rm -f /var/log/messages
lsof |grep /var/log/messages
cat /proc/653/fd/6
cat /proc/653/fd/6 > /var/log/messages
7.kill命令
kill命令:向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以SIG開頭(可省略),不區分大小寫
顯示當前系統可用信號: kill –l 或者 trap -l
常用信號:man 7 signal
1) SIGHUP 無須關閉進程而讓其重讀配置文件
2) SIGINT 中止正在運行的進程;相當於Ctrl+c
3) SIGQUIT 相當於ctrl+\
9) SIGKILL 強制殺死正在運行的進程
15) SIGTERM 終止正在運行的進程
18) SIGCONT 繼續運行
19) SIGSTOP 後臺休眠
指定信號的方法 :
(1) 信號的數字標識:1, 2, 9
(2) 信號完整名稱:SIGHUP
(3) 信號的簡寫名稱:HUP
(1)按PID:kill [-SIGNAL] pid …
kill –n SIGNAL pid
kill –s SIGNAL pid
(2)按名稱:killall [-SIGNAL] comm…
(3)按模式:pkill [options] pattern
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名(pgrep可用)
-a: 顯示完整格式的進程名(pgrep可用)
-P pid: 顯示指定進程的子進程
8.內存管理
1.free 命令
free 命令
內存空間使用狀態
free [OPTION]
-b 以字節爲單位
-m 以MB爲單位
-g 以GB爲單位
-h 易讀格式
-o 不顯示-/+buffers/cache行
-t 顯示RAM + swap的總和
-s n 刷新間隔爲n秒
-c n 刷新n次後即退出
[root@centos7 ~]#free -h
total used free shared buff/cache available
Mem: 1.8G 202M 1.2G 8.9M 439M 1.4G
Swap: 8.0G 0B 8.0G
2.pmap命令
pmap命令
查看進程的內存映像信息
pmap [ -x | -d ] [ -q ] pids...
pmap -V
-x extended Show the extended format. 顯示擴展格式
-d device Show the device format. 顯示設備格式
-q quiet Do not display some header/footer lines. 不顯示頭尾行
-V show version Displays version of program. 顯示版本
另外一種實現
cat /proc/PID/maps
擴展格式和設備格式域:
Address: start address of map 映像起始地址
Kbytes: size of map in kilobytes 映像大小
RSS: resident set size in kilobytes 駐留集大小
Dirty: dirty pages (both shared and private) in kilobytes 髒頁大小
Mode: permissions on map 映像權限: r=read, w=write, x=execute, s=shared, p=private (copy on write)
Mapping: file backing the map , or '[ anon ]' for allocated memory, or '[ stack ]' for the program stack. 映像支持文件,[anon]爲已分配內存 [stack]爲程序堆棧
Offset: offset into the file 文件偏移
Device: device name (major:minor) 設備名
例子
1)查看進程1的設備格式
[root@centos7 ~]#pmap -d 1
1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21
Address Kbytes Mode Offset Device Mapping
00007f93677ff000 4 ----- 0000000000000000 000:00000 [ anon ]
00007f9367800000 8192 rw--- 0000000000000000 000:00000 [ anon ]
00007f9368000000 164 rw--- 0000000000000000 000:00000 [ anon ]
00007f9368029000 65372 ----- 0000000000000000 000:00000 [ anon ]
...
mapped: 123304K writeable/private: 18016K shared: 0K
最後一行的值
mapped 表示該進程映射的虛擬地址空間大小,也就是該進程預先分配的虛擬內存大小,即ps出的vsz
writeable/private 表示進程所佔用的私有地址空間大小,也就是該進程實際使用的內存大小
shared 表示進程和其他進程共享的內存大小
2)查看進程1的設備格式,不顯示頭尾行
pmap -d -q 1
3)查看進程1的擴展格式
[root@centos7 ~]#pmap -x 1
1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21
Address Kbytes RSS Dirty Mode Mapping
00007f93677ff000 4 0 0 ----- [ anon ]
00007f9367800000 8192 2048 2048 rw--- [ anon ]
...
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 123304 5980 3592
4)循環顯示進程3066的設備格式的最後1行,間隔2秒,
while true; do pmap -d 3066 | tail -1; sleep 2; done
9.磁盤管理
1.vmstat命令
vmstat命令
虛擬內存信息
vmstat [options] [delay [count]]
-V:顯示vmstat版本信息
-n:只在開始時顯示一次各字段名稱
-a:顯示活躍和非活躍內存
-d:顯示各個磁盤相關統計信息
-D:顯示磁盤總體信息
-p:顯示指定磁盤分區統計信息
-s:顯示內存相關統計信息及多種系統活動數量
-m:顯示slabinfo
-t:在輸出信息的時候也將時間一併輸出出來
-S:使用指定單位顯示。參數有k、K、m、M,分別代表1000、1024、1000000、1048576字節(byte)。默認單位爲K(1024bytes)
delay:刷新時間間隔。如果不指定,只顯示一條結果
count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮
(1)procs:
r:可運行(正運行或等待運行)進程的個數,和核心數有關
b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
(2)memory:
swpd: 交換內存的使用總量
free:空閒物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量
(3)swap:
si:從磁盤交換進內存的數據速率(kb/s)
so:從內存交換至磁盤的數據速率(kb/s)
(4)io:
bi:從塊設備讀入數據到系統的速率(kb/s)
bo: 保存數據至塊設備的速率
(5)system:
in: interrupts 中斷速率,包括時鐘
cs: context switch 進程切換速率
(6)cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11前, unknown.
[root@centos7 ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1211740 2720 447016 0 0 31 3 55 92 0 0 99 0 0
2.iostat命令
iostat命令
iostat命令能監視系統的I/O活動,檢查物理磁盤就平均傳輸速率而言處於活躍狀態之中的時間長度。
該命令生成的報告可用於修改系統配置以便更好地平衡物理磁盤之間的I/O負荷。
常見用法:iostat 2 3 每隔2秒刷新顯示,且顯示3次
[root@centos7 ~]#iostat
Linux 3.10.0-327.el7.x86_64 (centos7.6) 01/17/2020 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.10 0.03 0.31 0.30 0.00 99.26
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sdd 0.04 0.30 0.00 1044 0
sdc 0.04 0.30 0.00 1044 0
sdb 0.20 1.58 0.59 5478 2048
sda 4.77 106.63 10.87 368866 37617
scd0 0.01 0.02 0.00 62 0
第一行:指示系統版本,主機名和當前日期
avg-cpu:總體CPU使用情況統計,對於多核CPU,這裏是所有CPU的平均值
Device:各磁盤設備的IO統計信息
%user:CPU在用戶態執行進程的時間百分比
%nice:CPU在用戶態模式下,用於nice操作,所佔CPU總時間的百分比
%system:CPU處在內核執行進程的時間百分比
%iowait:CPU用於等待IO操作所佔CPU總時間的百分比
%steal:管理程序(hypervisor)爲另一個虛擬進程提供服務而等待虛擬CPU的百分比
%idle:CPU空閒時間百分比
tps:每秒向磁盤設備請求數據次數,包括讀,寫請求,爲rtps與wtps的和
kB_read/s:每秒從設備讀取的數據量
kB_wrtn/s:每秒向設備寫入的數據量
kB_read:讀取的總數據量
kB_wrtn:寫入的總數據量
3.iotop命令
iotop命令
iotop命令是一個用來監視磁盤I/O使用狀況的top類工具iotop具有與top相似的UI,其中包括
PID、用戶、I/O、進程等相關信息,可查看每個進程是如何使用IO
常用參數:
-o, --only只顯示正在產生I/O的進程或線程,除了傳參,可以在運行過程中按o生效
-b, --batch非交互模式,一般用來記錄日誌
-n NUM, --iter=NUM設置監測的次數,默認無限。在非交互模式下很有用
-d SEC, --delay=SEC設置每次監測的間隔,默認1秒,接受非整形數據例如1.1
-p PID, --pid=PID指定監測的進程/線程
-u USER, --user=USER指定監測某個用戶產生的I/O
-P, --processes僅顯示進程,默認iotop顯示所有線程
-a, --accumulated顯示累積的I/O,而不是帶寬
-k, --kilobytes使用kB單位,而不是對人友好的單位。在非交互模式下,腳本編程有用
-t, --time 加上時間戳,非交互非模式
-q, --quiet 禁止頭幾行,非交互模式,有三種指定方式
-q 只在第一次監測時顯示列名
-qq 永遠不顯示列名
-qqq 永遠不顯示I/O彙總
交互按鍵
left和right方向鍵:改變排序
r:反向排序
o:切換至選項--only
p:切換至--processes選項
a:切換至--accumulated選項
q:退出
i:改變線程的優先級
[root@centos7 ~]#iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
362 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.03 % [kwo~/3:1]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % syst~ze 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kso~qd/0]
5 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kwo~0:0H]
iotop輸出
第一行:Read和Write速率總計
第二行:實際的Read和Write速率
第三行:參數如下:
線程ID(按p切換爲進程ID)
優先級
用戶
磁盤讀速率
磁盤寫速率
swap交換百分比
IO等待所佔的百分比
線程/進程命令
10.網絡管理
1.iftop命令
iftop命令
iftop是一款實時流量監控工具,監控TCP/IP連接等,缺點就是無報表功能。必須以root身份才能運行。
實例:
1)默認是監控第一塊網卡的流量
iftop
2)監控eth1
iftop -i eth1
3)直接顯示IP, 不進行DNS反解析
iftop -n
4)直接顯示連接埠編號, 不顯示服務名稱:
iftop -N
5)顯示某個網段進出封包流量
iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0
基於實例講解輸出含義
執行iftop -N -n -i eth1後界面爲
12.5Kb 25.0Kb 37.5Kb 50.0Kb 62.5Kb
└─────────────┴─────────────┴─────────────┴─────────────┴──────────────
10.0.7.70 => 10.0.7.1 688b 1.74Kb 1.18Kb
<= 184b 344b 255b
───────────────────────────────────────────────────────────────────────
TX: cum: 12.9KB peak: rates:b 688b 1.74Kb 1.18Kb
RX: 2.17KB 800b 184b 344b 255b
TOTAL: 15.0KB 5.62Kb 872b 2.08Kb 1.43Kb
iftop界面含義如下:
第一行:帶寬顯示
中間部分:外部連接列表,即記錄了哪些ip正在和本機的網絡連接
中間部分右邊:實時參數分別是該訪問ip連接到本機2秒,10秒和40秒的平均流量
=>代表發送數據,<= 代表接收數據
底部三行:表示發送,接收和全部的流量
底部三行第二列:爲你運行iftop到目前流量
底部三行第三列:爲高峯值
底部三行第四列:爲平均值
注意:通過iftop的界面很容易找到哪個ip在霸佔網絡流量,這個是ifstat做不到的。不過iftop的流量顯示單位是Mb,這個b是bit,是位,不是字節,而ifstat的KB,這個B就是字節了,byte是bit的8倍。初學者容易被誤導。
進入iftop的命令:
進入iftop畫面後的一些操作命令(注意大小寫)
按h切換是否顯示幫助;
按n切換顯示本機的IP或主機名;
按s切換是否顯示本機的host信息;
按d切換是否顯示遠端目標主機的host信息;
按t切換顯示格式爲2行/1行/只顯示發送流量/只顯示接收流量;
按N切換顯示端口號或端口服務名稱;
按S切換是否顯示本機的端口信息;
按D切換是否顯示遠端目標主機的端口信息;
按p切換是否顯示端口信息;
按P切換暫停/繼續顯示;
按b切換是否顯示平均流量圖形條;
按B切換計算2秒或10秒或40秒內的平均流量;
按T切換是否顯示每個連接的總流量;
按l打開屏幕過濾功能,輸入要過濾的字符,比如ip,按回車後,屏幕就只顯示這個IP相關的流量信息;
按L切換顯示畫面上邊的刻度;刻度不同,流量圖形條會有變化;
按j或按k可以向上或向下滾動屏幕顯示的連接記錄;
按1或2或3可以根據右側顯示的三列流量數據進行排序;
按<根據左邊的本機名或IP排序;
按>根據遠端目標主機的主機名或IP排序;
按o切換是否固定只顯示當前的連接;
按f可以編輯過濾代碼,這是翻譯過來的說法,我還沒用過這個!
按!可以使用shell命令,這個沒用過!沒搞明白啥命令在這好用呢!
按q退出監控。
2.nload命令
(1)nload是一個實時監控網絡流量和帶寬使用情況,以數值和動態圖展示進出的流量情況
(2)安裝:yum -y install nload (EPEL源)
(3)界面操作
上下方向鍵、左右方向鍵、enter鍵或者tab鍵都就可以切換查看多個網卡的流量情況
按 F2 顯示選項窗口
按 q 或者 Ctrl+C 退出 nload
(4)示例:
nload:默認只查看第一個網絡的流量進出情況
nload eth0 eth1:在nload後面指定網卡,可以指定多個
(5)設置刷新間隔:默認刷新間隔是100毫秒,可通過 -t命令設置刷新時間(單位是毫秒)
nload -t 500 eth0
(6)設置單位:顯示兩種單位一種是顯示Bit/s、一種是顯示Byte/s,默認是以Bit/s,也可不顯示/s
-u h|b|k|m|g|H|B|K|M|G 表示的含義: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H:auto, B: Byte/s, K: kByte/s, M: MByte/s
nload -u M eth0
-a:這個好像是全部數據的刷新時間週期,單位是秒,默認是300.
-i:進入網卡的流量圖的顯示比例最大值設置,默認10240 kBit/s.
-m:不顯示流量圖,只顯示統計數據。
-o:出去網卡的流量圖的顯示比例最大值設置,默認10240 kBit/s.
-t:顯示數據的刷新時間間隔,單位是毫秒,默認500。
-u:設置右邊Curr、Avg、Min、Max的數據單位,默認是自動變的。注意大小寫單位不同!
h|b|k|m|g h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc.
H|B|K|M|G H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc.
-U:設置右邊Ttl的數據單位,默認是自動變的.注意大小寫單位不同(與-u相同)!
Devices:自定義監控的網卡,默認是全部監控的,使用左右鍵切換。
Device eth1 [10.0.7.70] (2/5):
=======================================================================
Incoming:
Curr: 944.00 Bit/s
Avg: 1.15 kBit/s
Min: 936.00 Bit/s
Max: 3.83 kBit/s
Ttl: 610.68 kByte
Outgoing:
Curr: 7.29 kBit/s
Avg: 7.34 kBit/s
Min: 3.49 kBit/s
Max: 8.67 kBit/s
Ttl: 4.29 MByte
第一部分彙總:
首先是網卡名字,IP和網卡的序列,可以用方向鍵來切換。
第二部分Incoming:
進入網卡的流量
第三部分Outgoing:
從這塊網卡出去的流量。
最後面的部分:
Curr:當前的流量
Avg:平均的流量
Min:最小的流量
Max:最大的流量
Ttl:流量的總和
11.作業管理
(1)Linux的作業控制
前臺作業:通過終端啓動,且啓動後一直佔據終端
後臺作業:可通過終端啓動,但啓動後即轉入後臺運行(釋放終端)
(2)讓作業運行於後臺
(1) 運行中的作業: Ctrl+z
(2) 尚未啓動的作業: COMMAND &
(3)後臺作業雖然被送往後臺運行,但其依然與終端相關;退出終端,將關閉後臺作業。如果希望送往後臺後,剝離與終端的關係
nohup COMMAND &>/dev/null &
screen;COMMAND
(4)查看當前終端所有作業:jobs
(5)作業控制:
fg [[%]JOB_NUM]:把指定的後臺作業調回前臺
bg [[%]JOB_NUM]:讓送往後臺的作業在後臺繼續運行
kill [%JOB_NUM]: 終止指定的作業
(6)並行運行
同時運行多個進程,提高效率
方法1
vi all.sh
f1.sh&
f2.sh&
f3.sh&
方法2
(f1.sh&);(f2.sh&);(f3.sh&)
方法3
{ f1.sh& f2.sh& f3.sh& }
1.nohup命令
nohup命令
nohup Command [ Arg … ] [ & ]
(1)用途:不掛斷地運行命令。
(2)描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。
在註銷後使用 nohup 命令運行後臺中的程序。要運行後臺中的 nohup 命令,添加 & ( 表示”and”的符號)到命令的尾部。
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。
如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創建或打開以用於追加,那麼
Command 參數指定的命令不可調用。如果標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的所有輸出作爲標準輸出重定向到相同的文件描述符。
(3)退出狀態:該命令返回下列出口值:
126 可以查找但不能調用 Command 參數指定的命令。
127 nohup 命令發生錯誤或不能查找由 Command 參數指定的命令。
否則,nohup 命令的退出狀態是 Command 參數指定命令的退出狀態。
(4)nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。
該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。nohup就是不掛起的意思( n ohang up)。
操作系統中有三個常用的流:
0:標準輸入流 stdin
1:標準輸出流 stdout
2:標準錯誤流 stderr
一般當我們用 > console.txt,實際是 1>console.txt的省略用法;< console.txt ,實際是 0 < console.txt的省略用法。
例子:
nohup ./start-dishi.sh >output 2>&1 &
解釋:
1. 帶&的命令行,即使terminal(終端)關閉,或者電腦死機程序依然運行(前提是你把程序遞交到服務器上);
2. 2>&1的意思
這個意思是把標準錯誤(2)重定向到標準輸出中(1),而標準輸出又導入文件output裏面,所以結果是標準錯誤和標準輸出
都導入文件output裏面了。 至於爲什麼需要將標準錯誤重定向到標準輸出的原因,那就歸結爲標準錯誤沒有緩衝區,而stdout有。
這就會導致 >output 2>output 文件output被兩次打開,而stdout和stderr將會競爭覆蓋,這肯定不是我門想要的.
這就是爲什麼有人會寫成: nohup ./command.sh >output 2>output出錯的原因了
2.screen命令
簡介:
(1)Screen是一款由GNU計劃開發的用於命令行終端切換的自由軟件。用戶可以通過該軟件同時連接多個本地或遠程的命令行會話,
並在其間自由切換。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。
在Screen環境下,所有的會話都獨立的運行,並擁有各自的編號、輸入、輸出和窗口緩存。用戶可以通過快捷鍵在不同的窗口下切換,
並可以自由的重定向各個窗口的輸入和輸出。
(2)screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]
-A 將所有的視窗都調整爲目前終端機的大小。
-d <作業名稱> 將指定的screen作業離線。
-h <行數> 指定視窗的緩衝區行數。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r <作業名稱> 恢復離線的screen作業。
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s 指定建立新視窗時,所要執行的shell。
-S <作業名稱> 指定screen作業的名稱。
-v 顯示版本信息。
-x 恢復之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
(3)常用參數:
screen -S yourname -> 新建一個叫yourname的session
screen -ls -> 列出當前所有的session
screen -r yourname -> 回到yourname這個session
screen -d yourname -> 遠程detach某個session
screen -d -r yourname -> 結束當前session並回到yourname這個session
(4)在Session下,使用ctrl+a(C-a)
C-a ? -> 顯示所有鍵綁定信息
C-a c -> 創建一個新的運行shell的窗口並切換到該窗口
C-a n -> Next,切換到下一個 window
C-a p -> Previous,切換到前一個 window
C-a 0..9 -> 切換到第 0..9 個 window
Ctrl+a [Space] -> 由視窗0循序切換到視窗9
C-a C-a -> 在兩個最近使用的 window 間切換
C-a x -> 鎖住當前的 window,需用用戶密碼解鎖
C-a d -> detach,暫時離開當前session,將目前的 screen session (可能含有多個 windows) 丟到後臺執行,並會回到還沒進 screen 時的狀態,此時在 screen session 裏,每個 window 內運行的 process (無論是前臺/後臺)都在繼續執行,即使 logout 也不影響。
C-a z -> 把當前session放到後臺執行,用 shell 的 fg 命令則可回去。
C-a w -> 顯示所有窗口列表
C-a t -> time,顯示當前時間,和系統的 load
C-a k -> kill window,強行關閉當前的 window
C-a [ -> 進入 copy mode,在 copy mode 下可以回滾、搜索、複製就像用使用 vi 一樣
C-b Backward,PageUp
C-f Forward,PageDown
H(大寫) High,將光標移至左上角
L Low,將光標移至左下角
0 移到行首
$ 行末
w forward one word,以字爲單位往前移
b backward one word,以字爲單位往後移
Space 第一次按爲標記區起點,第二次按爲終點
Esc 結束 copy mode
C-a ] -> paste,把剛剛在 copy mode 選定的內容貼上
(5)常用操作
1)創建會話(-m 強制):
screen -dmS session_name
session_name session名稱
2)關閉會話:
screen -X -S [session # you want to kill] quit
3)查看所有會話:
screen -ls
4)進入會話:
screen -r session_name