我們的服務一般都是在linux系統運行,因此了解一些關於linux命令是必須。接下來將一一詳細介紹一些常用的linux的命令
- 文件操作
- 遠程登錄與操作
- 磁盤掛載
- 進程管理 啟動和結束
- 系統性能參數查看
- 網絡數據抓取
- shell 腳本命令
- jvm 常用命令
關注公眾號,一起交流,微信搜一搜: 潛行前行
1 文件操作命令
find
- find 用於在指定目錄下查找文件或子目錄,如果不指定查找目錄,則在當前目錄下查找
- 命令格式:
·find path -option [-print] [ -exec/-ok command {} \ ]
;- print: 將匹配的文件輸出到標准輸出
- exec:對匹配的文件作為參數 讓 command 命令執行。{} 是匹配文件的占位符
- ok: 和 exec 的作用相同,但在執行命令之前,會給出提示,讓用戶來確定是否執行
常用的option 選項 | 描述
-mount | 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件
-amin n | 在過去 n 分鍾內被讀取過
-atime n | 在過去 n 天內被讀取過的文件
-cmin n | 在過去 n 分鍾內被修改過
-ctime n | 在過去n天內被修改過的文件
-gid n | gid 是 n 文件。或 -group name, group 名稱是 name 的文件
-pid n | pid 是 n 的文件
-ipath p | 路徑名稱符合 p 的文件。或 -path p,ipath 會忽略大小寫
-name name | 文件名稱符合 name 的文件。或者-iname name,iname 會忽略大小寫
-size n | 文件大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組
-type c | 文件類型是c的文件。 d: 目錄;f: 一般文件;l: 符號連結;s: socket
- find 示例
~~ 查找 /var/log 目錄中更改時間在 7 日以前的普通文件,並在刪除之前詢問它們
# find /var/log -type f -mtime +7 -ok rm {} \;
touch 和 vim
- touch 可用於創建一個空文件,如果文件存在,則會更改文件的訪問時間和修改時間
- touch 示例
~~ #創建一個名為“file”的新的空白文件,如果存在則會修改其時間屬性
# touch file
- vim Vim是從 vi 發展出來的一個文本編輯器,是在 linux 系統交互界面進行文件查看,編寫文本的首選工具
- vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode)
1 命令模式:用戶 vim fileName,便進入了命令模式
i 切換到輸入模式,以輸入字符
: 冒號切換到底線命令模式
/word 向光標之下尋找一個名稱為 word 的字符串
?word 向光標之上尋找一個字符串名稱為 word 的字符串
n 重復前一個搜索(與 / 或 ? 有關)
N 反向重復前一個搜索(與 / 或 ? 有關)
PageUp 上翻頁
PageDown 下翻頁
G 移動到這個檔案的最后一行(常用)
nG n 為數字。移動到這個檔案的第 n 行
2 輸入模式: 在命令模式下按下i就進入了輸入模式; ESC 退出輸入模式,切換到命令模式
字符按鍵、shift組合 輸入字符
ENTER 回車鍵,換行
BACK SPACE 退格鍵,刪除光標前一個字符
DEL 刪除鍵,刪除光標后一個字符
方向鍵 在文本中移動光標
HOME/END 移動光標到行首/行尾
Page Up/Page Down 上/下翻頁
Insert 切換光標為輸入/替換模式,光標將變成豎線/下划線
3 底線命令模式: 在命令模式下按下 ":" 就進入了底線命令模式; ESC退出模式,切換到命令模式
:q 退出 vim 程序
:w 保存文件
:wq 保存后離開
:!q 不保存退出
:w [filename] 將編輯的數據儲存成另一個檔案
:r [filename] 在編輯的數據中,讀入另一個檔案的數據。追加到游標所在行后面
:!ShellCommand 暫時離開 vi 到指令行模式下執行 shellCommand 的顯示結果
:%s/word1/word2/g 從第一行到最后一行尋找 word1 字符串,並將該字符串取代為 word2
:%s/word1/word2/gc 和 %s/word1/word2/g 功能一致,不過每次替換都需用戶確認
less、cat、more、tail 和 head
- less 是linux 必不可少的查看文件工具,功能極其強大
less [option] 文件
option 常用參數
-f 強制打開文件,二進制文件顯示時,不提示警告;
-i 搜索時忽略大小寫;除非搜索串中包含大寫字母;
-I 搜索時忽略大小寫,除非搜索串中包含小寫字母;
-m 顯示讀取文件的百分比;
-M 顯法讀取文件的百分比、行號及總行數;
-N 在每行前輸出行號;
-p pattern 搜索 pattern;比如在/etc/profile搜索單詞MAIL,就用 less -p MAIL /etc/profile
-s 把連續多個空白行作為一個空白行顯示;
- less 文件后可進行的動作操作和 vim 在命令模式下的操作相似;less在查看文本時的常用動作命令如下
Enter 向下移動一行
y 向上移動一行
Space 向下滾動一屏
b 向上滾動一屏
d 向下滾動半屏
u 向上滾動半屏
g 跳到第一行
G 跳到最后一行
/pattern 向下搜索pattern ,比如 /MAIL 表示在文件中搜索MAIL單詞
?pattern 向上搜索pattern
n 重復前一個搜索(與 / 有關)
N 反向重復前一個搜索(與 / 有關)
v 調用 vi 編輯器
q 退出 less
!command 調用 shell 命令;比如 !ls 顯示當前目錄下的所有文件
- more 常用於顯示輸出的內容,然后根據窗口的大小進行分頁顯示,然后還能提示文件的百分比。命令格式:
more 文件
,more 常用操作指令如下
Enter 向下n行,需要定義,默認為1行;
Ctrl+f 向下滾動一屏
空格鍵 向下滾動一屏
Ctrl+b 返回上一屏
= 輸出當前行的行號
:f 輸出文件名和當前行的行號
v 當我們查看某一文件時,想調用vi來編輯它,用 v 動作指令
!command 調用 shell,並執行command命令
q 退出 more
- cat 常用於連接文件並打印到標准輸出設備上,也可用於查看文件。格式:
cat fileName [| command ]
,command 默認是 echo,cat會一次性顯示整個文件的內容,不分頁 - head 是顯示一個文件的內容的前多少行;常用命令格式:
head -n 行數值 文件名
- tail 是顯示一個文件的內容的后多少行;常用命令格式:
tail -n 行數值 文件名
grep、zgrep
- grep 一般用於在文件中查和匹配模式匹配的每一行數據。命令格式
grep [options] 'pattern' [files]
;grep 支持處理管道的輸出數據; pattern 支持正則表達式;files 可以是多個文件,用空格分開 - grep 無法在壓縮文件匹配查找數,此時可以用 zgrep,zgrep 適用處理壓縮后的gz等格式文件
options選項 | 功能描述
-i | 忽略大小寫
-v | 不匹配匹配的
-l | 輸出匹配的文件名
-L | 輸出不匹配的文件名
-c | 輸出匹配的數目(行數)
-C num | 輸出匹配的前后 num 條行數
-n | 輸出匹配行的同時在前面加上文件名及在文件名中的行數
- grep 和 zgrep 示例
~~ 輸出匹配 lwl 數據,及前后十行
# grep -C 10 'lwl' log.txt
cp
- 文件目錄復制可用使用 cp 命令。cp 格式:
cp [選項參數] fileSource... fileTarget
cp 選項參數 | 描述
-a | 此選項通常在復制目錄時使用,它保留鏈接、文件屬性,並復制目錄下的所有內容
-r | 若給出的源文件是一個目錄文件,此時將復制該目錄下所有的子目錄和文件
-f | 覆蓋已經存在的目標文件而不給出提示。
-i | 與 -f 選項相反,在覆蓋目標文件之前給出提示,要求用戶確認是否覆蓋,回答 y 時目標文件將被覆蓋
-l | 不復制文件,只是生成鏈接文件
- cp 示例
~~ 將當前目錄 csc/ 下的所有文件復制到新目錄 lwl 下
# cp –r csc/ lwl
mv
- mv 可用來移動文件夾、文件 或者 修改文件名、目錄名
option 參數 | 描述
-b | 當目標文件存在時,先進行備份再覆蓋
-f | 當目標文件存在時,強制覆蓋
-i | 默認選項,當目標文件存在時,提示是否覆蓋
-t | 先指定目標,再指定源目標。即目標 和 源目標 參數位置互換
- mv 示例
~~ 把 csc.txt 修改名字為 lwl.txt
# mv csc.txt lwl.txt
~~ 將 csc 目錄下的文件移到 lwl 下
# mv csc/ lwl
rm
- rm 命令用於刪除一個文件或者目錄;命令格式
rm [options] fileName/filePath
option參數 | 描述
-i | 刪除前逐一詢問確認
-f | 即使原檔案屬性設置為只讀,也可強制刪除,無需確認
-r | 將目錄及以下之檔案亦逐一刪除
- rm 示例
~~ 刪除文件名 test.txt
# rm -rf test.txt
mdkir
- mdkir命令用於創建目錄,
mkdir [-p] dirName
; -p 確保目錄名稱存在,不存在的就建一個
tar 和 jar
- tar 的命令格式:
tar [-option] fileName/filePath
;tar具有打包和壓縮功能,普通文件和文件夾可以被打包成 xxx.tar,如果要壓縮,則是在打包之后再壓縮,格式是 xxx.tar.gz
tar [-cxtzjvfpPN] 文件與目錄
常用參數:描述
-c :建立一個壓縮文件
-x :解開一個壓縮文件
-t :查看tarfile 里面的文件!特別注意,c/x/t 僅能存在一個,不可同時存在
-z :用 gzip 解壓縮
-j :用 bzip2 解壓縮
-v :壓縮的過程中顯示文件,這個常用,但不建議用
-f :使用檔名,在 f 之后要立即接檔名!例如使用『 tar -zcfv tfile sfile』就是錯誤的寫法,要寫成 『tar -zcvf tfile sfile』才對喔
-p :使用原文件的原來屬性(屬性不會依據使用者而變)
-P :(大寫P)使用絕對路徑來壓縮
-r : 新增文件到已存在的備份文件的結尾部分
-N :比后面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的文件中
--exclude file :在壓縮的過程中,不要將 FILE 打包
- tar 示例
~~ 打包不壓縮:/home/lwl 目錄
# tar -cvf lwl.tar /home/lwl
~~ 打包並壓縮:/home/lwl 目錄
# tar zcvf lwl.tar.gz /home/lwl
~~ 解壓 lwl.tar.gz
# tar zxvf lwl.tar.gz
~~ 壓縮 lwl.java 為 bz2 格式
# tar jcvf lwl.tar.bz2 lwl.java
~~ 解壓 lwl.tar.bz2
# tar jxvf lwl.tar.bz2
~~ 解壓部分文件 log2021.log
# tar -zxvf log.tar.gz log2021.log
- jar 的命令格式:
jar {c t x u f }[ v m e 0 M i ][-C 目錄] fileName
;其中{ ctxu }這四個選項必須選其一。[ v f m e 0 M i ]是可選選項,文件名是必須的
jar {c t x u f }[ v m e 0 M i ][-C 目錄] fileName
jar 的選項參數和 tar 差不多,如下
-c :創建一個jar包
-t :顯示jar中的內容列表
-x :解壓jar包
-u :添加文件到jar包中
-f :指定jar包的文件名
-v :生成詳細的報造,並輸出至標准設備
-m :指定manifest.mf文件.(manifest.mf 文件中可以對jar包及其中的內容作一些一設置)
-0 :產生jar包時不對其中的內容進行壓縮處理
-M :不產生所有文件的清單文件(Manifest.mf)。這個參數會忽略掉 -m 參數的設置
-i :為指定的jar文件創建索引文件
-C :表示轉到相應的目錄下執行jar命令,相當於cd到那個目錄,然后不帶-C執行jar命令
- jar 示例
~~ 利用hello目錄創建 hello.jar 包,並顯示創建過程
# jar cvf hello.jar hello
~~ 往 jar 包添加文件,將 HelloWorld.java 添加到 hello.jar 包中
# jar uf hello.jar HelloWorld.java
~~ 解壓 hello.jar 至當前目錄
# jar xvf hello.jar
chmod
- chmod 是控制用戶對文件的權限的命令, 命令格式:
chmod [-cfvR] mode file
## -cfvR 參數解析
-c : 若該文件權限確實已經更改,才顯示其更改動作
-f : 若該文件權限無法被更改也不要顯示錯誤訊息
-v : 顯示權限變更的詳細資料
-R : 對目前目錄下的所有文件與子目錄進行相同的權限變更(即以遞歸的方式逐個變更)
## mode [ugoa][+-=][rwxX-] 參數解析
u 表示該文件的擁有者
g 表示與該文件的擁有者屬於同一個群體(group)者
o 表示其他以外的人
a 包扣 u g o
## [+-=]
+ 表示增加權限
- 表示取消權限
= 表示唯一設定權限
## [rwxX-]
r 表示可讀取
w 表示可寫入
x 表示可執行
X 只有當文件為目錄文件,或者其他類型的用戶有可執行權限時,才將文件權限設置可執行
- 不具任何權限
- chmod 示例
# chmod ugo+r lwl.txt
# chmod ug+w,o-w csc.txt lwl.txt
ln
- 命令格式:
ln [options] [源文件或目錄] [目標文件或目錄]
;當我們需要在不同的目錄,用到相同的文件時,又不想浪費空間復制相同的文件,可以用ln 鏈接它,相當創建一個快捷圖標
options 參數 | 描述
-b | 刪除,覆蓋以前建立的鏈接
-d | 允許超級用戶制作目錄的硬鏈接
-f | 強制執行
-i | 交互模式,文件存在則提示用戶是否覆蓋
-n | 把符號鏈接視為一般目錄
-s | 軟鏈接(符號鏈接)
- 軟鏈接: 以路徑的形式存在。類似於Windows操作系統中的快捷方式;可以對一個不存在的文件名進行鏈接;可以對目錄進行鏈接;軟鏈接可以 跨文件系統 ,硬鏈接不可以
- 硬鏈接: 以文件副本的形式存在。但不占用實際空間;不允許給目錄創建硬鏈接;硬鏈接只有在同一個文件系統中才能創建
- ln 示例
~~ 給文件創建軟鏈接,log2021.log文件創建軟鏈接log2021,如果log2021.log丟失,log2021將失效
# ln -s log2021.log link2021
2 遠程登錄與操作
ssh
- linux下的ssh服務是一個守護進程(demon),ssh 服務端的進程名為 sshd ,負責實時監聽客戶端的請求(默認22端口),包括公共秘鑰等交換等信息。ssh的客戶端可以用 xShell,Securecrt, Mobaxterm等工具進行連接,也可以在 linux 命令窗口使用 ssh 命令連接 ssh 服務端
- 命令格式:
ssh [-p port] user@remoteIp
或者ssh [-p port] user@remoteIp shellCommand
; 會提示輸入密碼 - ssh示例
~~ 登錄 192.168.25.137 ,並執行 ls /backup/data
# ssh root@192.168.25.137 ls /backup/data
sftp
- 登錄sftp服務器
sftp -oPort=23 user@remoteIp
~~ 上傳,第一個目錄是本機的, 第二個參數遠端的
> put /etc/hosts /home/lwl
~~ 下載,第一個目錄是遠端的, 第二個參數是本機的
> get /home/lwl /home/csc
scp
- 如果是涉及不同linux系統間的文件復制則用 scp, 格式:
scp [options] fileSource fileTarget
options 選項參數 | 描述
-P | port:注意是大寫的P, port是指定數據傳輸用到的端口號
-p | 保留原文件的修改時間,小寫p,訪問時間和訪問權限
-r | 遞歸復制整個目錄
-C | 允許壓縮。(將-C標志傳遞給ssh,從而打開壓縮功能)
- scp 示例
~~ 從本地復制到遠程
~~ A 格式: scp localFile username@remoteIp:filePath; B 格式:scp localFile remoteIp:filePath
~~ A 命令指定了用戶名,但命令執行后需要輸入密碼,B 格式則需要輸入用戶名和密碼
# scp -r /home/lwl/ root@www.csc.com:/home/lwl/
~~ 從遠程復制到本地
~~ 格式:scp remoteIp:filePath localFile
# scp -r www.csc.com:/home/lwl/ /home/lwl/
文件同步 rsync
- 與其他文件傳輸工具(如 FTP 或 scp)不同,和 scp 功能類似。 rsync 的最大特點是會檢查發送方和接收方已有的文件
# rsync -r source destination
linux與客戶端的上傳下載命令:rz、sz
- 用 ssh 管理 linux 服務器時經常需要遠程與 win 本地之間交互文件。直接用SecureCRT自帶的上傳下載功能無疑是最方便的。上傳:rz、下載:sz
- 在 window 上使用SecureCRT、XShell 軟件,用 rz、sz 進行上傳下載
~~ 上傳文件到linux;彈出SecureCRT上傳窗口,用SecureCRT來上傳
# rz
~~ 下載文件到客戶端(window)
# sz filename
3 磁盤掛載
df
- df 用於查看磁盤空間占用情況:
df [-options] [file]
options 參數解釋
-i 顯示inode信息
-h 方便閱讀方式顯示
-k 區塊為1024字節
-m 區塊為1048576字節
-a 全部文件系統列表
-T 顯示文件系統類型
-t<文件系統類型> 只顯示選定文件系統的磁盤信息
-x<文件系統類型> 不顯示選定文件系統的磁盤信息
- df 示例
# df -hT
文件系統 類型 容量 已用 可用 已用% 掛載點
devtmpfs devtmpfs 63G 0 63G 0% /dev
tmpfs tmpfs 63G 0 63G 0% /dev/shm
tmpfs tmpfs 63G 4.1G 59G 7% /run
tmpfs tmpfs 63G 0 63G 0% /sys/fs/cgroup
mount
- mount 命令是經常會使用到的命令,它用於掛載Linux系統外的文件
命令格式:mount [-t vfstype] [-o options] device dir
1、-t vfstype 指定文件系統的類型,通常不必指定,mount 會自動選擇正確的類型
iso9660 : 光盤或光盤鏡像
msdos : DOS fat16文件系統
vfat : Windows 9x fat32文件系統
ntfs : Windows NT ntfs文件系統
smbfs : Mount Windows文件網絡共享
nfs :UNIX(LINUX) 文件網絡共享
2、-o options 主要用來描述設備或檔案的掛接方式
loop :用來把一個文件當成硬盤分區掛接上系統
ro :采用只讀方式掛接設備
rw :采用讀寫方式掛接設備
iocharset :指定訪問文件系統所用字符集
3、device 要掛接(mount)的設備
4、dir設備在系統上的掛接點(mount point)
- mount 示例
~~ 1 掛接U盤,/dev/sdd1 是 U 盤里的磁盤分區
# mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb
~~ 2 掛接Windows文件共享
~~ administrator 和 pldy123 是ip地址為10.140.133.23 windows計算機的一個用戶名和密碼,c$是這台計算機的一個磁盤共享
# mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba
~~ 3 linux 掛接(mount)其他linux系統 NFS 共享
/export/home/sunky 10.140.133.23(rw) ~~ 在服務端 /etc/exports文件配置共享目錄
~~ 在服務端啟動 nfs 服務
/etc/rc.d/init.d/nfs start 啟動NFS服務
/etc/rc.d/init.d/nfs stop 停止NFS服務
~~ linux 客戶端掛接 NFS 共享
# mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs
4 進程管理 啟動和結束
systemctl 和 service
- service 命令本身是一個shell腳本,它會在 /etc/init.d/ 目錄查找指定的服務腳本,然后調用該服務腳本來完成任務;service命令用於對系統服務進行管理,比如啟動(start)、停止(stop)、重啟(restart)、查看狀態(status)等。命令格式:
service 服務名 [start|stop|restart|reload|status]
~~ service 命令: 停止、啟動、查看 redis服務
# service redis stop ~~ 等於在 /etc/init.d/ 目錄下運行 ./redis stop
# service redis start ~~ 等於在 /etc/init.d/ 目錄下運行 ./redis start
# service redis status ~~ 等於在 /etc/init.d/ 目錄下運行 ./redis status
- systemctl 命令兼容了 service 命令,且包含其他更強大功能
- systemctl 用來管理 linux系統的多種資源:系統服務、硬件設備、掛載點、socket等;下面則主要介紹關於 service 系統服務的相關命令使用。因為 systemctl 一般用於實現服務自啟動的腳本
~~ 系統自啟動時 啟動 cron 服務,啟用或禁用它
# systemctl enable crond.service
# systemctl disable ccrond.service
# systemctl is-active crond.service ~~ 是否正在運行
# systemctl is-enabled crond.service ~~ 是否建立了啟動鏈接
~~ 啟動、重啟、停止、重載、殺死服務以及查看服務 httpd
# systemctl start httpd.service
# systemctl restart httpd.service
# systemctl stop httpd.service
# systemctl reload httpd.service
# systemctl status httpd.service
# systemctl kill apache.service
~~ 列出所有服務(包括啟用的和禁用的)
# systemctl list-units ~~ 列出所有管理的資源單元
# systemctl list-unit-files --type=service ~~ 只列出所有 service 類型資源
~~ 獲取某個服務(httpd)的依賴性列表
# systemctl list-dependencies httpd.service
~~ 檢查 httpd 服務的所有配置細節
# systemctl show httpd
- xxx.service 文件的詳細配置介紹請上網自行查看,下面給個簡單的模板介紹
[Unit]
Description:描述
After:auditd.service 在auditd.service啟動后才啟動
ConditionPathExists: 執行條件
[Service]
EnvironmentFile: 變量所在文件
ExecStart: 執行啟動命令
Restart: fail時重啟
[Install]
Alias:服務別名
WangtedBy: 多用戶模式下需要的
nohup 和 &
- nohup 和 & 組合可以不掛斷地在后台運行進程,命令格式:
nohup command [agrs..] [&]
。& 表示程序可以在linux 后台運行,在當前 shell 界面ctrl C
退出,該程序也能繼續運行,它可以忽略 SIGINT 信號,不過它會隨着 shell 程序的關閉而停止,這是因為 & 運行的進程對 SIGHUP 信號不免疫 - 加上 nohup 就可以做到忽略SIGHUP信號
~~ 在后台運行 lwl.py,且不隨着 shell 關閉而死亡。永遠存在
# nohup python lwl.py &> /var/log/lwl.log &
kill
- 如果在linux遇到需要殺死或停止某進程,可以使用 kill, 示例:
# kill -9 1211
。kill 也不單單用於停止進程,可用kill [-s <指定信號>][程序]
發送指定信號給指定程序,而# kill -l
可列出全部的信號名稱。
~~ 列出全部的信息名稱
# 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
...
...
~~ 發送 SIGQUIT 給 pid = 1211 的進程
# kill -s SIGQUIT 1211 ~~ 或者 kill -SIGQUIT 1211
5 系統性能參數查看
ps
- ps 命令用於顯示當前進程的狀態。命令格式:
ps [options]
options 參數解釋
-A/a 列出所有的進程
-e 等於 “-A”
f 顯示程序間的關系
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程
ps -ef
各項指標解釋
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 6 18:39 pts/0 00:02:27 java -jar /opt/lp-admin.jar
root 102 0 0 18:40 pts/1 00:00:00 /bin/bash
root 158 102 0 18:47 pts/1 00:00:00 /usr/bin/python /usr/bin/dstat
---------各項指標解析-----------------------
UID 程序的執行者 UID
PID 進程的ID號
PPID 則是其上級父程序的ID
C cpu 使用的資源百分比
TTY 登入者的終端機位置
TIME CPU 執行的時間
CMD 進程執行的命令
ps -aux
各項指標解釋
# ps -aux
ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 7.0 5.3 13278220 1736948 pts/0 Ssl+ 18:39 2:24 java -jar /opt/lp-admin.jar
root 102 0.0 0.0 15264 2044 pts/1 Ss 18:40 0:00 /bin/bash
root 158 0.0 0.0 52176 6756 pts/1 T 18:47 0:00 /usr/bin/python /usr/bin/dstat
root 159 0.0 0.0 52176 6756 pts/1 T 18:49 0:00 /usr/bin/python /usr/bin/dstat -n -N eth0,total
---------各項指標解析-----------------------
USER 行程擁有者
PID pid
%CPU 占用的 CPU 使用率
%MEM 占用的記憶體使用率
VSZ 占用的虛擬記憶體大小
RSS 占用的記憶體大小
TTY 終端的次要裝置號碼 (minor device number of tty)
STAT 該進程程的狀態:
D: 無法中斷的休眠狀態 (通常 IO 的進程)
R: 正在執行中
S: 可中斷的睡眠狀態
T: 暫停狀態或跟蹤狀態
Z: 僵屍進程(zombie),無法正常終止
X: 退出狀態,進程即將被銷毀
START 登入者的終端機位置
TIME CPU 執行的時間
COMMAND 進程執行的命令
lsof
- lsof(List Open Files) 用於查看你進程開打的文件,打開文件的進程,進程打開的端口(TCP、UDP)。命令格式
lsof [options] filename
options 參數解釋
-a 列出打開文件存在的進程
-c<進程名> 列出指定進程所打開的文件(常用)
-p<進程號> 列出指定進程號所打開的文件(常用)
-g 列出屬於gid的進程詳情
-u<uname/uid> 顯示歸屬uname或uid的進程情況
-d<fd文件號> 列出占用該文件號的進程
+d<目錄> 列出目錄下被打開的文件
+D<目錄> 遞歸列出目錄下被打開的文件
-n<目錄> 列出使用NFS的文件
-i<條件> 列出符合條件的進程。(ip4/ip6協議、端口、 @ip )
-u 列出UID號進程詳情
- lsof 各項指標解釋
# lsof
command PID USER FD type DEVICE SIZE NODE NAME
init 1 root txt REG 8,2 43496 6121706 /sbin/init
---------各項指標解析-----------------------
COMMAND 進程的名稱
PID 進程標識符
USER 進程所有者
FD 文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
TYPE 文件類型,如DIR、REG等
DEVICE 指定磁盤的名稱
SIZE 文件的大小
NODE 索引節點(文件在磁盤上的標識)
NAME 打開文件的確切名稱
- lsof 示例
~~ 顯示所有打開80端口的進程
# lsof -i:80
~~ 那個進程在占用/etc/passwd
# lsof /etc/passwd
~~ 顯示使用fd為1211的進程
# lsof -d 1211
~~ 顯示那些文件被pid為 1211 的進程打開
# lsof -p 1211
~~ 查看sendmail進程的文件使用情況
# lsof -c sendmail
pidof
- pidof 是linux系統中用來查找正在運行進程的進程號(pid)的工具。如果我們提前知道進程名,則可以根據進程名查找pid,命令格式:
pidof [options] 進程名稱
options 選項參數
-s: 僅返回一個進程號;
-c: 僅顯示具有相同“root”目錄的進程
-x: 顯示由腳本開啟的進程
-o: 指定不顯示的進程ID
- pidof 示例
# pidof -s nginx
1211
top
- top 命令是用來監控Linux系統狀況,比如cpu、內存,進程等資源使用情況。命令格式:
top [-options]
options 選項參數
-i<時間> 設置刷新間隔時間
-u<用戶名> 指定用戶名
-p<進程號> 指定進程
-H 開啟線程查看
- top 各項輸出指標解釋
# top
top - 18:20:27 up 26 days, 8:30, 2 users, load average: 0.04, 0.09, 0.13
Tasks: 168 total, 1 running, 167 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.5 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 32762356 total, 14675196 used, 18087160 free, 884 buffers
KiB Swap: 2103292 total, 0 used, 2103292 free. 6580028 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1260 root 20 0 7933492 1.173g 14004 S 0.333 3.753 58:20.74 java
1503 root 20 0 69172 2240 1412 S 0.333 0.007 0:48.05 httpd
1520 daemon 20 0 358140 3980 776 S 0.333 0.012 6:19.55 httpd
2323 mysql 20 0 19.918g 4.538g 9404 S 0.333 14.52 352:51.44 mysqld
.......
---------各項指標解析---------------------------------------------------
第一行統計信息區
18:20:27 當前時間
up 25 days, 17:29 系統運行時間,格式為時:分
1 user 當前登錄用戶數
load average: 0.04, 0.09, 0.13 系統負載,三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值
Tasks:進程相關信息
running 正在運行的進程數
sleeping 睡眠的進程數
stopped 停止的進程數
zombie 僵屍進程數
Cpu(s):CPU相關信息
%us:表示用戶空間程序的cpu使用率(沒有通過nice調度)
%sy:表示系統空間的cpu使用率,主要是內核程序
%ni:表示用戶空間且通過nice調度過的程序的cpu使用率
%id:空閑cpu
%wa:cpu運行時在等待io的時間
%hi:cpu處理硬中斷的數量
%si:cpu處理軟中斷的數量
%st:被虛擬機偷走的cpu
Mem 內存信息
total 物理內存總量
used 使用的物理內存總量
free 空閑內存總量
buffers 用作內核緩存的內存量
Swap 內存信息
total 交換區總量
used 使用的交換區總量
free 空閑交換區總量
cached 緩沖的交換區總量
~~ 常用的指標
PID 進程id
PPID 父進程id
UID 進程所有者的用戶id
USER 進程所有者的用戶名
GROUP 進程所有者的組名
TTY 啟動進程的終端名。不是從終端啟動的進程則顯示為 ?
PR 優先級
NI nice值。負值表示高優先級,正值表示低優先級
P 最后使用的CPU,僅在多CPU環境下有意義
%CPU 上次更新到現在的CPU時間占用百分比
TIME 進程使用的CPU時間總計,單位秒
TIME+ 進程使用的CPU時間總計,單位1/100秒
%MEM 進程使用的物理內存百分比
VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
CODE 可執行代碼占用的物理內存大小,單位kb
DATA 可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb
SHR 共享內存大小,單位kb
S 進程狀態; 相關枚舉值解釋查看 ps -ef S 項解釋
COMMAND 進程啟動執行的命令行
- top 命令下,查看信息常用快捷鍵
h 顯示快捷鍵幫助
k 終止一個進程
i 開/關忽略閑置和僵死進程
q 退出程序
r 重新安排一個進程的優先級別
S 切換到累計模式
s 更改刷新間隔時間,單位秒
f,F 從當前顯示中添加或者刪除項目
o,O 改變顯示項目的順序
l 切換顯示平均負載和啟動時間信息
m 切換顯示內存信息
t 切換顯示進程和CPU狀態信息
c 切換顯示命令名稱和完整命令行
M 根據內存使用大小排序
P 根據CPU使用率進行排序 (默認排序)
T 根據時間/累計時間進行排序
1 展開多核cpu顯示
H 線程查看模式切換為開或關
free
- free 可查看系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩沖區內存。命令格式:
free [-bkmg][-hlot][s delay][-c count]
free 選項參數
-b,-k,-m,-g 表示輸出顯示的單位為 bytes,KB,MB,or GB,不添加選項的話默認以 KB 為單位顯示
-h 以人類可讀的方式顯示,即后邊會自動帶上單位
-l 顯示詳細的低內存和高內存統計信息(增加了 Low 和 High 這兩行顯示)
-o 使用舊的格式顯示(不顯示 -/+buffers/cache 這一行)
-t 增加顯示 Total 行,Total = Mem + Swap
-s delay 每 delay 秒重復打印一次,delay 為具體的秒數
-c count 循環打印 count 次后退出,count 為具體的次數。需要配合 -s delay 使用
# free -m
total used free shared buffers cached
Mem: 32107 30414 1692 0 1962 8489
-/+ buffers/cache: 19962 12144
Swap: 0 0 0
------各項指標解釋-------------------------------------------------
Mem 表示物理內存統計:
total 物理內存總量,total = used + free
used 總使用緩存的數量(包含 buffers 與 cache),但其中可能部分緩存並未實際使用
free 未被分配的內存
shared 共享內存,一般系統不會用到,總是0
buffers 系統分配但未被使用的 buffers 數量
cached 系統分配但未被使用的 cache 數量
-/+ buffers/cache:
used 實際使用內存,等於第一行的 used - buffers - cached
free 實際可用內存,等於第一行的 free + buffers + cached
Swap表示交換區的使用情況,也就是我們通常所說的虛擬內存
total 總量虛擬內存
used 使用的虛擬內存
free 空閑的虛擬內存
mpstat
- mpstat 是 Multiprocessor Statistics 的縮寫,可以查看多核心的 cpu 中每個計算核心的統計數據。命令格式:
mpstat [-P {cpu|ALL}] [delay [count]]
-P {cpu|ALL} 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值
delay 相鄰的兩次采樣的間隔時間
count 采樣的次數,count只能和delay一起使用
# mpstat -P ALL 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:19:07 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:19:09 PM all 21.43 3.36 6.54 6.45 0.00 1.29 0.00 0.00 0.00 60.93
07:19:09 PM 0 20.41 3.57 7.14 4.08 0.00 1.53 0.00 0.00 0.00 63.27
07:19:09 PM 1 22.45 3.06 6.12 5.10 0.00 1.53 0.00 0.00 0.00 61.73
---------各項輸出指標解釋----------------------------------------------
CPU 處理器ID
%usr 在 delay 時間段里,用戶態的 cpu 時間(%)
%nice
%sys 在 delay 時間段里,核心時間(%)
%iowait 在 delay 時間段里,硬盤IO等待時間(%)
%irq 在 delay 時間段里,硬中斷時間(%)
%soft 在 delay 時間段里,軟中斷時間(%)
%steal 虛擬機管理器在服務另一個虛擬處理器時虛擬CPU處在非自願等待下花費時間的百分比
%guest 顯示運行虛擬處理器時 CPU 花費時間的百分比
%gnice gnice/total*100
%idle 在internal時間段里,CPU除去等待磁盤IO操作外的因為任何原因而空閑的時間閑置時間(%)
iostat
- iostat 主要用於輸出 CPU 和磁盤 I/O 相關的統計信息,命令格式:
iostat [options] [delay [count]]
options 選項參數
-c 只顯示系統CPU統計信息,即單獨輸出avg-cpu結果,不包括device結果
-d 單獨輸出Device結果,不包括cpu結果
-k/-m 輸出結果以kB/mB為單位,而不是以扇區數為單位
-x 輸出更詳細的io設備統計信息
delay 每次輸出間隔時間
count 表示輸出次數,不帶count表示循環輸出
- 默認命令
iostat
的各項指標解析
# iostat
Linux 4.4.73-5-default 2021年07月08日 _x86_64_ (40 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.50 0.41 0.94 0.02 0.00 96.13
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 12.09 27.80 507.24 57343492 1046298308
sdb 17.95 30.91 647.84 63751096 1336305974
------各項指標解析-----------------------------------------------------------
avg-cpu: 總體cpu使用情況統計信息,對於多核cpu,這里為所有cpu的平均值
%user 用戶空間的CPU使用率
%nice CPU處在帶NICE值的用戶模式下的時間百分比
%system 內核空間的CPU使用率
%iowait CPU等待IO的百分比
%steal 虛擬機的虛擬機CPU使用的CPU
%idle 空閑的CPU
Device: 各磁盤設備的IO統計信息。各列含義如下:
tps 每秒進程下發的IO讀、寫請求數量
KB_read/s 每秒從驅動器讀入的數據量,單位為K。
KB_wrtn/s 每秒從驅動器寫入的數據量,單位為K。
KB_read 讀入數據總量,單位為K。
KB_wrtn 寫入數據總量,單位為K
iostat -x -k -d 1 2
的各項指標解析
# iostat -x -k -d 1 1
Linux 4.4.73-5-default (ceshi44) 2021年07月08日 _x86_64_ (40 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.08 2.48 0.37 11.71 27.80 507.24 88.53 0.02 1.34 14.96 0.90 0.09 0.10
sdb 0.00 1.20 1.28 16.67 30.91 647.83 75.61 0.17 9.51 9.40 9.52 0.32 0.57
------各項指標解析----------------------------------------------------------
rrqm/s: 每秒對該設備的讀請求被合並次數,文件系統會對讀取同塊(block)的請求進行合並
wrqm/s: 每秒對該設備的寫請求被合並次數
r/s: 每秒完成的讀次數
w/s: 每秒完成的寫次數
rkB/s: 每秒讀數據量(kB為單位)
wkB/s: 每秒寫數據量(kB為單位)
avgrq-sz: 平均每次IO操作的數據量(扇區數為單位)
avgqu-sz: 平均等待處理的IO請求隊列長度
await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
svctm: 平均每次IO請求的處理時間(毫秒為單位)
%util: 采用周期內用於IO操作的時間比率,即IO隊列非空的時間比率
netstat
- netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,網絡連接狀態。命令格式:
netstat [-options]
options 參數解析
-a (all)顯示所有選項,默認不顯示 Listen 相關
-t (tcp)僅顯示tcp相關選項
-u (udp)僅顯示udp相關選項
-n 拒絕顯示別名,能顯示數字的全部轉化成數字。
-l 僅列出有在 Listen (監聽) 的服務狀態
-p 顯示建立相關鏈接的程序名
-r 顯示路由信息,路由表
-e 顯示擴展信息,例如uid等
-s 按各個協議進行統計
-c 每隔一個固定時間,執行該netstat命令
- 各項輸出指標解析
# netstat -pt
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost:30037 *:* LISTEN 2109/firefox
....
------各項指標解析----------------------------------------
Proto 協議
Recv-Q 接收隊列 ,一般都應該是0。如果不是則表示軟件包正在隊列中堆積
Send-Q 發送隊列,一般都應該是0。如果不是則表示軟件包正在隊列中堆積
Local Address 本地地址+port
Foreign Address 遠端地址+port
State 狀態
PID 進程pid
Program name 進程名
- netstat 常用命令示例
# netstat -anp
# netstat -tnlp
vmstat
- vmstat (虛擬內存統計)可對操作系統的內存、進程、CPU,磁盤進行監控。相比top,可以看到整個機器的CPU、內存、IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)
- 命令格式
// -a:顯示活躍和非活躍內存 -n:只在開始時顯示一次各字段名稱
# vmstat [-a] [-n] [delay [count]]
// f:總的fork進程 s:內存使用的詳細信息 d:磁盤的讀/寫 m:系統的slab信息
# vmstat [-fsdm]
// 查看指定磁盤分區統計信息
# vmstat [-p disk partition]
- vmstat 示例
$ vmstat 2 1
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 3498472 315836 3819540 0 0 0 1 2 0 3 1 96 0 0
------各項指標解析----------------------------------------
Procs(進程)
r: 運行隊列中進程數量,當這個值超過了CPU數目,就會出現CPU瓶頸了
b: 等待IO的進程數量
Memory(內存):
swpd: 使用虛擬內存大小,如果大於0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了
free: 可用內存大小
buff: 用作緩沖的內存大小
cache: 用作緩存的內存大
Swap:
si: 每秒從交換區寫到內存的大小,如果這個值大於0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉
so: 每秒寫入交換區的內存大小
IO:(現在的Linux版本塊的大小為1024bytes)
bi: 每秒讀取的塊數
bo: 每秒寫入的塊數,bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整
系統
in: 每秒中斷數,包括時鍾中斷
cs: 每秒上下文切換數,調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好
CPU(以百分比表示):
us: 用戶進程執行時間
sy: 系統進程執行時間
id: 空閑時間(包括IO等待時間),中央處理器的空閑時間
wa: 等待 IO 時間
st: 虛擬機的虛擬機CPU使用的CPU
dstat
- vmstat 是對系統的整體情況進行統計,無法對某個進程進行深入分析,所以推薦下 dstat。dstat 是一個可以取代vmstat、iostat、netstat 這些命令的多功能命令工具,執行 dstat 命令,默認情況它會收集-cpu-、-disk-、-net-、-paging-、-system-的數據,一秒鍾收集一次。命令格式:
dstat [options] [delay [count]]
,其中使用 -p pid 選項可針對某一進程進行統計監控
options 常用參數解析
-l 顯示負載統計量
-c 開啟cpu統計
-C <CPU> 選項跟着 cpu 的編號,顯示該cpu 的統計
-d 開啟 disk 統計
-g 開啟分頁統計
-y 開啟系統統計,包括中斷和上下文切換
-i 開啟中斷統計
-s 開啟 swap 統計,包括used, free
-m 顯示內存使用率(包括used,buffer,cache,free值)
-n 開啟網絡讀寫統計
–socket 顯示網絡統計數據
–tcp 顯示常用的TCP統計
-N 選項跟着網絡設備名,多個用逗號隔開,進行網絡統計
-p 開啟對進程統計,runnable, uninterruptible, new
-r io開啟請求統計,包括read requests, write requests
--output文件 此選項也比較有用,可以把狀態信息以csv的格式重定向到指定的文件中
-–disk-util 顯示某一時間磁盤的忙碌狀況
-–freespace 顯示當前磁盤空間使用率
-–proc-count 顯示正在運行的程序數量
--top-bio-adv 指出塊I/O最大的進程
--top-cputime 耗費CPU時間最多的進程名和耗費時間
--top-cpu-adv 顯示CPU占用最大的進程
-–top-io 顯示正常I/O最大的進程
-–top-mem 顯示占用最多內存的進程
- 輸出指標解析
# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
29 7 57 6 0 1| 85k 1457k| 0 0 | 0 0 |8350 67k
30 9 54 6 0 1| 0 1290k| 857B 568B| 0 0 | 33k 75k
...
------各項指標解析-----------------------------------
CPU的使用率
usr 顯示了用戶占比
sys 系統占比
idl 空閑占比
wai 等待占比
hiq 硬中斷
siq 軟中斷情況
磁盤的讀寫
read 磁盤的讀總數
writ 磁盤的寫總數
網絡設備發送和接受的數據
recv 網絡收數據總數
send 網絡發數據總數
系統的分頁活動
in 內存頁換入
out 內存頁換出
系統統計
int 統計中斷
csw 上下文切換
- 指定展示各個網卡的收發狀態
# dstat -n -N eth0,total
--net/eth0---net/total-
recv send: recv send
0 0 : 0 0
140B 140B: 140B 140B
18k 6570B: 18k 6570B
- 查看全部內存都有誰在占用
# dstat -g -l -m -s --top-mem
---paging-- ---load-avg--- ------memory-usage----- ----swap--- --most-expensive-
in out | 1m 5m 15m | used buff cach free| used free| memory process
0 0 |5.44 4.77 5.09|23.2G 2108k 7892M 233M| 0 0 |java 1670M
0 0 |5.44 4.77 5.09|23.3G 2108k 7893M 221M| 0 0 |java 1670
- 進程最耗資源統計
# dstat --top-cpu-adv 1 2
-------most-expensive-cpu-process-------
process pid cpu read write
java 1 0.0% 43B 0
java 1 0.2% 0 0
sar
- sar 和 dstat 差不多,隨你們各自喜好使用,可以從多方面對系統的資源進行監控,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及 IPC 有關的活動等。命令格式:
sar [options] [-A] [-o file] delay [count]
。delay 為采樣間隔,count 為采樣次數,默認值是1
options 選項參數
-A 所有報告的總和
-o file 表示將命令結果以二進制格式存放在文件中,file 是文件名
-u 輸出CPU使用情況的統計信息
-v 輸出inode、文件和其他內核表的統計信息
-d 輸出每一個塊設備的活動信息
-b 顯示I/O和傳送速率的統計信息(相對-d 是匯總信息)
-r 輸出內存和交換空間的統計信息
-R 輸出內存頁面的統計信息
-a 文件讀寫情況
-q 隊列長度和平均負載
-c 輸出進程統計信息,每秒創建的進程數
-y 終端設備活動情況
-w 輸出系統交換活動信息
-x <pid> 顯示給定進程的統計信息
-n <關鍵詞> 統計網絡信息
關鍵詞可以是:
DEV 網卡
EDEV 網卡 (錯誤)
NFS NFS 客戶端
NFSD NFS 服務器
SOCK Sockets (套接字) (v4)
SOCK6 Sockets (套接字) (v6)
IP IP 流 (v4)
EIP IP 流 (v4) (失敗信息)
ICMP ICMP 流 (v4)
EICMP ICMP 流 (v4) (失敗信息)
TCP TCP 流 (v4)
ETCP TCP 流 (v4) (失敗信息)
UDP UDP 流 (v4)
IP6 IP 流 (v6)
EIP6 IP 流 (v6) (失敗信息)
ICMP6 ICMP 流 (v6)
EICMP6 ICMP 流 (v6) (失敗信息)
UDP6 UDP 流 (v6)
- 查看 CPU 使用情況:
sar -u 1 2
# sar -u 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:02:04 PM CPU %user %nice %system %iowait %steal %idle
07:02:05 PM all 23.90 3.22 7.97 5.25 0.00 59.66
07:02:06 PM all 26.53 4.76 8.84 5.95 0.00 53.91
Average: all 25.21 3.99 8.40 5.60 0.00 56.79
------各項指標解析---------------------------------
%user 用戶空間的CPU使用
%nice 改變過優先級的進程的CPU使用率
%system 內核空間的CPU使用率
%iowait CPU等待IO的百分比
%steal 虛擬機的虛擬機CPU使用的CPU
%idle 空閑的CPU
- 查看內存使用情況
sar -r
# sar -r 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:05:16 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
07:05:17 PM 299596 32398396 99.08 2084 7615088 37900868 115.91 27267692 3809860 672
07:05:18 PM 298932 32399060 99.09 2084 7615848 37900100 115.91 27267828 3810252 488
Average: 299264 32398728 99.08 2084 7615468 37900484 115.91 27267760 3810056 580
------各項指標解析--------------------
kbmemfree 空閑的物理內存大小
kbmemused 使用中的物理內存大小
%memused 物理內存使用率
kbbuffers 內核中作為緩沖區使用的物理內存大小,kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache.
kbcached 緩存的文件大小
kbcommit 保證當前系統正常運行所需要的最小內存,即為了確保內存不溢出而需要的最少內存(物理內存+Swap分區)
commit 這個值是kbcommit與內存總量(物理內存+swap分區)的一個百分比的值
- 查看 IO 和傳遞速率:
sar -b
# sar -b 1 2
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:06:08 PM tps rtps wtps bread/s bwrtn/s
07:06:09 PM 171.00 0.00 171.00 0.00 3431.00
07:06:10 PM 163.00 0.00 163.00 0.00 2620.00
Average: 167.00 0.00 167.00 0.00 3025.50
------各項指標解析--------------------
tps 磁盤每秒鍾的IO總數,等於iostat中的tps
rtps 每秒鍾從磁盤讀取的IO總數
wtps 每秒鍾從寫入到磁盤的IO總數
bread/s 每秒鍾從磁盤讀取的塊總數
bwrtn/s 每秒鍾此寫入到磁盤的塊總數
- 網絡接口信息:
sar -n DEV
# sar -n DEV 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:06:57 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
07:06:58 PM eth0 2.00 4.00 1.45 0.56 0.00 0.00 0.00
07:06:58 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:06:58 PM tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: eth0 2.00 4.00 1.45 0.56 0.00 0.00 0.00
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: tunl0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
------各項指標解析--------------------
IFACE 本地網卡接口的名稱
rxpck/s 每秒鍾接受的數據包
txpck/s 每秒鍾發送的數據庫
rxKB/S 每秒鍾接受的數據包大小,單位為KB
txKB/S 每秒鍾發送的數據包大小,單位為KB
rxcmp/s 每秒鍾接受的壓縮數據包
txcmp/s 每秒鍾發送的壓縮包
rxmcst/s 每秒鍾接收的多播數據包
- 查看磁盤使用情況:
sar -d
。相對 -b 它可以看到各個設備的信息,-b 輸出的是匯總信息
sar -d -p 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:08:41 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
07:08:42 PM sdb 160.00 0.00 2914.00 18.21 1.51 9.43 3.73 59.70
07:08:42 PM sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:08:42 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: sdb 160.00 0.00 2914.00 18.21 1.51 9.43 3.73 59.70
Average: sdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
------各項指標解析--------------------
DEV 磁盤設備的名稱,如果不加-p,會顯示dev253-0類似的設備名稱,因此加上-p顯示的名稱更直接
tps 每秒I/O的傳輸總數
rd_sec/s 每秒讀取的扇區的總數
wr_sec/s 每秒寫入的扇區的總數
avgrq-sz 平均每次次磁盤I/O操作的數據大小(扇區)
avgqu-sz 磁盤請求隊列的平均長度
await 從請求磁盤操作到系統調用完成處理,每次請求的平均消耗時間
svctm I/O的服務處理時間,即不包括請求隊列中的時間
%util I/O請求占用的CPU百分比,值越高,說明I/O越慢
- 統計socket連接信息:
sar -n SOCK 1 1
# sar -n SOCK 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:09:18 PM totsck tcpsck udpsck rawsck ip-frag tcp-tw
07:09:19 PM 10910 261 0 0 0 562
Average: 10910 261 0 0 0 562
------各項指標解析--------------------
totsck 當前被使用的socket總數
tcpsck 當前正在被使用的TCP的socket總數
udpsck 當前正在被使用的UDP的socket總數
rawsck 當前正在被使用於RAW的skcket總數
if-frag 當前的IP分片的數目
tcp-tw TCP套接字中處於TIME-WAIT狀態的連接數量
- TCP連接的統計:
sar -n TCP
# sar -n TCP 1 1
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
07:09:39 PM active/s passive/s iseg/s oseg/s
07:09:40 PM 1.00 0.00 5.00 7.00
Average: 1.00 0.00 5.00 7.00
------各項指標解析--------------------
active/s 新的主動連接
passive/s 新的被動連接
iseg/s 接受的段
oseg/s 輸出的段
pidstat
- pidstat是sysstat工具的一個命令,用於監控全部或指定進程的cpu、內存、線程、設備IO等系統資源的占用情況。命令格式:
pidstat [options] [delay [count]]
options 參數解析
-u 默認的參數,顯示各個進程的cpu使用統計
-r 顯示各個進程的內存使用統計
-d 顯示各個進程的IO使用情況
-p <pid> 指定進程號
-w 顯示每個進程的上下文切換情況
-t 顯示選擇進程的線程的統計信息
- 查看所有進程的 CPU 使用情況:
pidstat -u
# pidstat -u
Linux 4.4.73-5-default (ceshi44) 2021年07月08日 _x86_64_ (40 CPU)
14時11分56秒 UID PID %usr %system %guest %CPU CPU Command
14時11分56秒 0 1 0.15 0.06 0.00 0.22 22 systemd
....
------各項指標解析----------------------------------------
UID 進程所屬UID
PID 進程ID
%usr 進程在用戶空間占用cpu的百分比
%system 進程在內核空間占用cpu的百分比
%guest 進程在虛擬機占用cpu的百分比
%CPU 進程占用cpu的百分比
CPU 處理進程的cpu編號
Command 當前進程對應的命令
- 內存使用情況統計:
pidstat -r
# pidstat -r
Linux 4.4.73-5-default (ceshi44) 2021年07月08日 _x86_64_ (40 CPU)
14時13分08秒 UID PID minflt/s majflt/s VSZ RSS %MEM Command
14時13分08秒 0 1 41.04 0.00 186020 5968 0.00 systemd
14時13分08秒 0 443 0.00 0.00 5828 3004 0.00 pidstat
....
------各項指標解析----------------------------------------
PID 進程標識符
Minflt/s 任務每秒發生的次要錯誤,不需要從磁盤中加載頁
Majflt/s 任務每秒發生的主要錯誤,需要從磁盤中加載頁
VSZ 虛擬地址大小,虛擬內存的使用KB
RSS 常駐集合大小,非交換區五里內存使用KB
Command task命令名
- 顯示各個進程的IO使用情況:
pidstat -d
# pidstat -d
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
06:42:35 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
06:42:35 PM 0 1 0.05 0.00 0.00 java
06:42:35 PM 0 102 0.04 0.05 0.00 bash
------各項指標解析---------------------------
kB_rd/s 每秒從磁盤讀取的KB
kB_wr/s 每秒寫入磁盤KB
kB_ccwr/s 任務取消的寫入磁盤的KB。當任務截斷臟的pagecache的時候會發生
Command 進程執行命令
- 顯示每個進程的上下文切換情況:
pidstat -w
# pidstat -w
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b) 07/11/2021 _x86_64_ (6 CPU)
06:43:23 PM UID PID cswch/s nvcswch/s Command
06:43:23 PM 0 1 0.00 0.00 java
06:43:23 PM 0 102 0.00 0.00 bash
06:43:23 PM 0 150 0.00 0.00 pidstat
------各項指標解析---------------------------
PID 進程id
Cswch/s 每秒主動任務上下文切換數量
Nvcswch/s 每秒被動任務上下文切換數量
Command 進程執行命令
- 指定進程並( -t)顯示進程的線程統計信息:
pidstat -t -p 1211
# pidstat -t -p 1211
06:44:37 PM UID TGID TID %usr %system %guest %CPU CPU Command
06:44:37 PM 0 1 - 0.00 0.00 0.00 0.00 3 java
06:44:37 PM 0 - 1 0.00 0.00 0.00 0.00 3 |__java
06:44:37 PM 0 - 6 0.00 0.00 0.00 0.00 5 |__java
06:44:37 PM 0 - 7 0.00 0.00 0.00 0.00 4 |__java
...
------各項指標解析---------------------------
TGID 主線程的表示
TID 線程id
%usr 進程在用戶空間占用cpu的百分比
%system 進程在內核空間占用cpu的百分比
%guest 進程在虛擬機占用cpu的百分比
%CPU 進程占用cpu的百分比
CPU 處理進程的cpu編號
Command 當前進程對應的命令
pstree
- ps 命令可以顯示當前正在運行的那些進程的信息,但是對於它們之間的關系卻顯示得不夠清晰,pstree 命令可以以樹狀圖顯示進程間的關系。命令格式:
pstree [-p] <pid>
# pstree -p 3169
mongod(3169)─┬─{mongod}(3170)
├─{mongod}(3173)
├─{mongod}(3174)
├─{mongod}(3175)
├─{mongod}(3177)
├─{mongod}(3178)
├─{mongod}(3179)
├─{mongod}(3180)
strace
- strace 可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間命令格式:
strace [options] [command]
。如果指定進程pid,要去掉 command
options 簡單常用的參數解析
-c 統計每一系統調用的所執行的時間,次數和出錯的次數等
-t 在輸出中的每一行前加上時間信息
-tt 在輸出中的每一行前加上時間信息,微秒級
-ttt 微秒級輸出,以秒了表示時間
-T 顯示每一調用所耗的時間
-e trace= 只跟蹤指定的系統 調用.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統調用,默認是 all
-e trace=file 只跟蹤有關文件操作的系統調用
-e trace=process 只跟蹤有關進程控制的系統調用
-e trace=network 跟蹤與網絡有關的所有系統調用
-e trace=ipc 跟蹤所有與進程通訊有關的系統調用
-o filename 將strace的輸出寫入文件filename
-p pid 跟蹤指定的進程pid
- strace 示例
# strace ls
# strace cat /dev/null
# strace -o output.txt -T -tt -e trace=all -p 28979
- 每一行都是一條系統調用,等號左邊是系統調用的函數名及其參數,右邊是該調用的返回值
pmap
- pmap 提供了進程的內存映射,pmap命令用於顯示一個或多個進程的內存狀態。其報告進程的地址空間和內存狀態信息
pmap [options] PID
options 參數解析
-x extended顯示擴展格式
-d device顯示設備格式
# pmap -dx 1
Address Kbytes Mode Offset Device Mapping
00110000 1480K r-x- 0000000000000000 008:00005 /usr/lib/libcrypto.so.1.0.0
00282000 80K rw-- 0000000000015000 008:00005 /usr/lib/libcrypto.so.1.0.0
00296000 12K rw-- 0000000000015000 008:00005 [ anon ]
.....
------各項指標解析----------------------------------------
Address: 內存開始地址
Kbytes: 占用內存的字節數(KB)
RSS: 保留內存的字節數(KB)
Dirty: 臟頁的字節數(包括共享和私有的)(KB)
Mode: 內存的權限:read、write、execute、shared、private (寫時復制)
Mapping: 占用內存的文件、或[anon](分配的內存)、或[stack](堆棧)
Offset: 文件偏移
Device: 設備名 (major:minor)
watch
- watch 可以幫助實現定時輸出的命令結果,比如 netstat 沒有間隔輸出結果的功能。
watch [-options] <command>
options 常用參數選項
-n <num> watch 默認每2秒運行一下程序,可以用 -n 來指定間隔的時間
-d watch 會高亮顯示變化的區域
切換終端: Ctrl+x 退出watch:Ctrl+g
- watch 示例
# watch -n 1 -d netstat -ant
# watch uptime
6 網絡數據抓取
tcpdump
- tcpdump 是一個運行在命令行下的抓包工具。它允許用戶攔截和顯示發送或收到過網絡連接到該計算機的TCP/IP和其他數據包。tcpdump 適用於大多數的類Unix系統操作系統;tcpdump 命令格式為:
# tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]
[ -i 網絡接口 ] [ -r 文件名] [ -s len ]
[ -T 類型 ] [ -w 文件名 ] [ 表達式 ]
選項參數
-a 將網絡地址和廣播地址轉變成名字
-d 將匹配信息包的代碼以人們能夠理解的匯編格式給出
-dd 將匹配信息包的代碼以c語言程序段的格式給出
-ddd 將匹配信息包的代碼以十進制的形式給出
-e 在輸出行打印出數據鏈路層的頭部信息,包括源mac和目的mac,以及網絡層的協議
-f 將外部的Internet地址以數字的形式打印出來
-l 使標准輸出變為緩沖行形式
-n 指定將每個監聽到數據包中的域名轉換成IP地址后顯示,不把網絡地址轉換成名字
-nn: 指定將每個監聽到的數據包中的域名轉換成IP、端口從應用名稱轉換成端口號后顯示
-t 在輸出的每一行不打印時間戳
-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息
-vv 輸出詳細的報文信息
-c 在收到指定的包的數目后,tcpdump就會停止
-F 從指定的文件中讀取表達式,忽略其它的表達式
-i 指定監聽的網絡接口
-p: 將網卡設置為非混雜模式,不能與host或broadcast一起使用
-r 從指定的文件中讀取包(這些包一般通過-w選項產生)
-w 直接將包寫入文件中,並不分析和打印出來
-s len len 表示從一個包中截取的字節數。0表示包不截斷,抓完整的數據包。默認的話 tcpdump 只顯示部分數據包,默認68字節
-T 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議)
-X 告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。
- 表達式選項 大體可以分成三種過濾條件,“類型”、“方向”和“協議”,這三種條件的搭配組合就構成了我們的過濾表達式
- 類型關鍵字:主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網絡地址,port 21 指明端口號是21
- 傳輸方向的關鍵字:主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明了傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網絡地址是210.11.0.0
- 協議的關鍵字:主要包括 ether,ip,ip6,arp,rarp,tcp,udp等類型,及這幾個的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的(更具體的請自行查看官方文檔)
第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”;
提示使用選項 -v 和 -vv,可以看到更全的輸出內容
第二行“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”;
我們監聽的是通過 eth0 這個NIC設備的網絡包,且它的鏈路層是基於以太網的,要抓的包大小限制是65535字節。包大小限制值可以通過-s選項來設置
第三行”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”
12:40:33.569037 分別對應着這個包被抓到的“時”、“分”、“秒”、“微妙”。 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址 00:19:e0:b5:10:94 發送到MAC地址為 00:1a:a0:31:39:d4 的主機,ethertype IPv4 (0x0800)表示Ethernet幀的協議類型為ipv4(即代碼為0x0800)
第四行”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808;
length 66表示以太幀長度為66。 210.45.123.249.27236 表示這個包的源IP為210.45.123.249,源端口為27236,’>’表示數據包的傳輸方向, 172.16.0.11.1111, 表示這個數據包的目的端ip為172.16.0.11,目標端口為1111,1111端口是我的一個web服務器監聽端口。Flags是[S],表明是syn建立連接包(即三次握手的第一次握手),seq1624463808 序號為1624463808,這個其實就是TCP三次握手的第一次握手:client(210.45.123.249)發送syn請求建立連接包
第五行” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”
win 8192 表示窗口大小為8192字節。options[mss 1460,nop,wscale 2,nop,nop,sackOK]為tcp首部可選字段mss 1460表示mss是發送端(客戶端)通告的最大報文段長度,發送端將不接收超過這個長度的TCP報文段(這個值和MTU有一定關系)。nop是一個空操作選項, wscale指出發送端使用的窗口擴大因子為2, sackOK 表示發送端支持並同意使用SACK選
- tcpdump 示例
~~ 只查目標機器端口是21或80的網絡包,其他端口不關注
# tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
~~ 想獲取172.16.10.11 和 google.com之間建立TCP三次握手中帶有SYN標記位的網絡包.
# tcpdump -i eth0 'host 172.16.0.11 and host google.com and tcp[13]&2!=0' -c 3 -nn
- 最后一命令的 tcp[13]&2!=0 可能有點怪,這里解析一下,標志位(URG,ACK,PSH,RST,SYN,FIN)在 tcp頭部的第 13 個字節中,而 SYN 則在低第二位(xxxxxx10,十進制是2),和2進行與操作,即可判斷報文是否 syn 報文
nc
- nc 命令實現任意TCP/UDP端口的偵聽,nc可以作為 server 以TCP或UDP方式偵聽指定端口。nc 也可以作為 client 發起TCP或UDP連接
options 常用參數
-l 用於指定nc將處於偵聽模式。指定該參數,則意味着nc被當作server,偵聽並接受連接,而非向其它地址發起連接。
-s 指定發送數據的源IP地址,適用於多網卡機
-u 指定nc使用UDP協議,默認為TCP
-v 輸出交互或出錯信息,新手調試時尤為有用
-w 超時秒數,后面跟數字
-z 使用 Zero-I/O mode,只在掃描通信端口時使用
- nc 示例
~~ 端口掃描
# nc -v -w 2 192.168.2.34 -z 21-24
nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused
Connection to 192.168.2.34 22 port [tcp/ssh] succeeded!
~~ 簡單聊天工具 在 192.168.2.34 服務端監聽 1211
# nc -l 1211
~~ 在 192.168.2.33 上 連接 34 的 1211端口
# nc 192.168.2.34 1211
curl
- curl 是一款很強大的 http 命令行工具。它支持文件的上傳和下載。命令格式:
curl [option] [url]
option 常用參數
-A/--user-agent <string> 設置用戶代理發送給服務器
-b <name=string/file> cookie字符串或文件讀取位置
-c <file> 操作結束后把cookie寫入到這個文件中
-C <offset> 斷點續轉
-D <file> 把header信息寫入到該文件中
-e 來源網址(偽造referer)
-o 把輸出寫到該文件中
-O 把輸出寫到該文件中,保留遠程文件的文件名
-r <range> 分塊下載來自HTTP/1.1或FTP服務器 range字節
-T <file> 上傳文件
-u <user[:password]> 設置服務器的用戶和密碼
-L 參數會讓 HTTP 請求跟隨服務器的重定向。curl 默認不重定向
-x <host:port> 在給定的端口上使用HTTP代理
-# 進度條顯示當前的傳送狀態
-X 指定 HTTP 請求的方法
-d POST方式傳送數據(默認是application/x-www-form-urlencoded)
-H/--header <line> 自定義頭信息傳遞給服務器
- curl 示例
~~ 顯示下載進度條
# curl -# -O http://www.linux.com/lwl.jpg
~~ 上傳文件
# curl -T lwl.jpg -u 用戶名:密碼 ftp://www.linux.com/img/
~~ 發出 POST 請求
# curl -X POST https://www.example.com
~~ data.json 是json 數據
# curl localhost:3000/api/json -X POST -d @data.json --header "Content-Type: application/json"
wget
- wget 是一個下載文件的工具,對於Linux用戶是必不可少的工具,因為我們經常要下載一些軟件或從遠程服務器恢復備份到本地服務器。wget支持HTTP,HTTPS和FTP協議。命令格式:
wget [-options] [url]
options 常用參數解析
-O <fileName> 把文檔寫到FILE文件中
-c (斷點續傳)接着下載沒下載完的文件
-P filePath 將文件保存到 filePath 目錄
-b 后台下載
TP 選項:
--ftp-user=USER 設置 ftp 用戶名為 USER
--ftp-password=PASS 設置 ftp 密碼為 PASS
- wget 示例
~~ wget -b 后台下載
# wget -c -b -O wordpress.zip https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
~~ ftp 下載 csc.txt 文件
# wget --ftp-user=baidu --ftp-password=123 ftp://192.168.19.1/lwl/csc.txt
7 shell 腳本命令
shell 程序語法
- 要想寫shell 腳本,則需要熟悉下 shell 程序基本語法
- 之前寫的一篇文章:shell教程及腳本編寫
sed
- 如果涉及到文本處理,可試試 sed,sed 采用的是流編輯模式,在 sed 處理數據之前,需要預先提供一組規則,sed 會按照此規則來編輯數據
- 之前寫的一篇文章:sed教程-linux命令
awk
- awk 同樣適合處理文本,且更強大; 和 sed 命令類似,awk 命令也是逐行掃描文件,尋找含有目標文本的行,如果匹配成功,則會在該行上執行用戶想要的操作;反之,則不對行做任何處理
- 之前寫的一篇文章:awk教程-linux命令
xargs
- xargs 是一個強有力的命令,在 linux 命令管道傳遞中,它能夠捕獲上一個命令的輸出,然后傳遞給另外一個命令。xargs 默認的命令是 echo,這意味着通過管道傳遞給 xargs 的輸入將會包含換行和空白,不過通過 xargs 的處理,換行和空白將被空格取代
- 命令格式:
command |xargs [-options] nextCommand
options 參數解釋
-e flag 或 -E flag flag必須是一個以空格分隔的標志,當xargs分析到含有flag這個標志的時候就停止
-r no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不再去執行
-t 表示先打印命令,然后再執行
-p 每執行一次xargs 后面跟隨的 nextCommand 時,詢問一次用戶
-n num 將輸出數據用"空格"分割成多個參數,再按n個一組分批作為 nextCommand 執行時的參數
-L num 或 -l num 從標准輸入一次讀取 num 行送給 nextCommand 命令執行
-i 或 -I 將一行一行賦值給占位符 {},在接下來的command里用 {} 替換數據
-s num 命令行的最大字符數,指的是 xargs 后面那個命令的最大命令行字符數
-d delim 指定分隔符,默認的xargs分隔符是回車(換行鍵),這里修改的是xargs的分隔符
- xargs 示例
~~ 復制所有圖片文件到 /data/images 目錄下
# ls *.jpg | xargs -n1 -I {} cp {} /data/images
~~ 查找所有的 jpg 文件,並且壓縮它們
# find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
8 jvm 常用命令
jps
- java 版的 ps 命令,查看java進程及其相關的信息,如果想找到一個 java 進程的 pid,那可以用 jps 命令替代linux中的 ps 命令了,命令格式:
jps [-options] [hostIP]
。如果要查看其他 hostIP 機器上的jvm進程,需要在待查看機器上啟動 jstatd
options 參數解釋
-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啟動時傳遞給main()的參數
-v : 輸出JVM啟動時顯示指定的JVM參數
- jps 示例
# jps -lmv
18884 /opt/app/spring-boot/order.jar --spring.profiles.active=test
39812 /opt/app/spring-boot/user.jar --spring.profiles.active=test
jinfo
- jinfo 是用來查看JVM參數和動態修改部分JVM參數的命令;命令格式:
jinfo [-option] <pid>
options 參數解釋
-flag <name> 打印指定名稱的參數
-flag [+|-]<name> 打開或關閉參數
-flag <name>=<value> 設置參數
-flags 打印所有參數
-sysprops 打印系統配置
默認是 flags 和 sysprops
- jinfo 示例
# jinfo -flags 19092
Attaching to process ID 19092, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:+ManagementServer -XX:Max
HeapSize=4229955584 -XX:MaxNewSize=1409810432 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassP ointers -XX:+UseCompressedOops
.....
jstat
- jstat 命令是使用頻率比較高的命令,主要用來查看JVM運行時的狀態信息,包括內存狀態、垃圾回收等;命令格式:
jstat [-option] pid [interval] [count]
,pid 是進程id,interval 是打印間隔時間(毫秒),count是打印次數(默認一直打印)
option 參數解釋
-class : class loader的行為統計
-compiler : HotSpt JIT編譯器行為統計
-gc : 垃圾回收堆的行為統計
-gccapacity : 各個垃圾回收代容量(young,old,perm)和他們相應的空間統計
-gcutil : 垃圾回收統計概述
-gccause : 垃圾收集統計概述(同-gcutil),附加最近兩次垃圾回收事件的原因
-gcnew : 新生代行為統計
-gcnewcapacity : 新生代與其相應的內存空間的統計
-gcold : 年老代和永生代行為統計
-gcoldcapacity : 年老代行為統計
-gcpermcapacity : 永生代行為統計
-printcompilation : HotSpot編譯方法統計
- jstat 示例
# jstat -gcutil 18884
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 84.14 19.93 45.77 91.32 87.65 641 18.311 6 3.512 21.824
------各項指標解析----------------------------------------
S0 第 0 個 survivor(幸存區)使用的百分比
S1 第 1 個 survivor(幸存區)使用的百分比
E Eden 區使用內存的百分比
O 老生代內存使用的百分比
P/M PermGen/MetaSpace 的內存使用百分比
YGC 程序啟動以來 Young GC 發生的次數
YGCT 程序啟動以來 Young GC 共消耗的時間(s)
FGC 程序啟動以來 Full GC 發生的次數
FGCT 程序啟動以來 Full GC 共消耗的時間(s)
GCT 程序啟動以來 GC 的總用時(s)
jstack
- jstack 是用來查看 jvm 線程快照的命令,線程快照是當前JVM線程正在執行的方法堆棧集合。使用 jstack 命令可以定位線程出現長時間卡頓的原因,例如死鎖,死循環等。jstack 還可以查看程序崩潰時生成的 core 文件中的 stack 信息;命令格式:
jstack [-Flm] <pid>
option 參數解釋
-F 當使用jstack <pid>無響應時,強制輸出線程堆棧
-m 同時輸出java和本地堆棧(混合模式)
-l 額外顯示鎖信息 (小寫l)
- jstack 示例,查看 pid = 1211 的線程棧
# jstack -l 1211
"DiscoveryClient-CacheRefreshExecutor-0" #146 daemon prio=5 os_prio=0 tid=0x000000002ba2c000 nid
=0x4fe4 waiting on condition [0x000000002cade000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000006c775dc60> (a java.util.concurrent.SynchronousQueue$Tra
nsferStack)
......
jmap
- jmap 是用來生成堆dump文件 或 查看堆相關的各類信息的命令,例如查看 finalize 執行隊列,heap 的詳細信息和使用情況;命令格式:
jmap [-option] <pid>
option 參數解釋
-heap 打印java heap摘要
-histo[:live] 打印堆中的java對象統計信息
-clstats 打印類加載器統計信息
-finalizerinfo 打印在f-queue中等待執行finalizer方法的對象
-dump:<dump-options> 生成java堆的dump文件
dump-options:
live 只轉儲存活的對象,如果沒有指定則轉儲所有對象
format=b 二進制格式
file=<file> 轉儲文件到 <file>
-F 如果jvm掛起,可用-F強制執行選項,會影響java 服務
- jmap 示例,dump 出 pid=1211 java進程的內存堆文件
# jmap -dump:live,format=b,file=dump.hprof 1211
Dumping heap to /home/lwl/dump.hprof ...
Heap dump file created