?
前言
大家好,這里是浩道linux,主要給大家分享linux、python、網絡通信相關的IT知識平臺。
今天浩道跟大家分享一個技術大牛分享關于他常用的linux命令,讓你面對眾多linux命令有一個好的選擇。工欲善其事,必先利其器!選擇適合自己的工具,方能在工作中發揮最大優勢!
基本操作
Linux 關機,重啟
?
#?關機 shutdown?-h?now #?重啟 shutdown?-r?now
?
?
#?查看系統內核信息 uname?-a #?查看系統內核版本 cat?/proc/version #?查看當前用戶環境變量 env cat?/proc/cpuinfo #?查看有幾個邏輯cpu,?包括cpu型號 cat?/proc/cpuinfo?|?grep?name?|?cut?-f2?-d:?|?uniq?-c #?查看有幾顆cpu,每顆分別是幾核 cat?/proc/cpuinfo?|?grep?physical?|?uniq?-c #?查看當前CPU運行在32bit還是64bit模式下,?如果是運行在32bit下也不代表CPU不支持64bit getconf?LONG_BIT #?結果大于0,?說明支持64bit計算.?lm指long?mode,?支持lm則是64bit cat?/proc/cpuinfo?|?grep?flags?|?grep?'?lm?'?|?wc?-l
?
建立軟連接
?
ln?-s?/usr/local/jdk1.8/?jdk
?
rpm相關
?
#?查看是否通過rpm安裝了該軟件 rpm?-qa?|?grep?軟件名
?
sshkey
?
#?創建sshkey ssh-keygen?-t?rsa?-C?your_email@example.com #id_rsa.pub?的內容拷貝到要控制的服務器的?home/username/.ssh/authorized_keys?中,如果沒有則新建(.ssh權限為700,?authorized_keys權限為600)
?
命令重命名
?
#?在各個用戶的.bash_profile中添加重命名配置 alias?ll='ls?-alF'
?
同步服務器時間
?
sudo?ntpdate?-u?ntp.api.bz
?
后臺運行命令
?
#?后臺運行,并且有nohup.out輸出 nohup?xxx?& #?后臺運行,?不輸出任何日志 nohup?xxx?>?/dev/null?& #?后臺運行,?并將錯誤信息做標準輸出到日志中? nohup?xxx?>out.log?2>&1?&
?
強制活動用戶退出
?
#?命令來完成強制活動用戶退出.其中TTY表示終端名稱 pkill?-kill?-t?[TTY]
?
查看命令路徑
?
which?<命令>
?
查看進程所有打開最大fd數
?
ulimit?-n
?
配置dns
?
vim?/etc/resolv.conf
?
nslookup,查看域名路由表
?
nslookup?google.com
?
last, 最近登錄信息列表
?
#?最近登錄的5個賬號 last?-n?5
?
設置固定ip
?
ifconfig?em1??192.168.5.177?netmask?255.255.255.0
?
查看進程內加載的環境變量
?
#?也可以去?cd?/proc?目錄下,?查看進程內存中加載的東西 ps?eww?-p??XXXXX(進程號)
?
查看進程樹找到服務器進程
?
ps?auwxf
?
查看進程啟動路徑
?
cd?/proc/xxx(進程號) ls?-all #?cwd對應的是啟動路徑
?
添加用戶, 配置sudo權限
?
#?新增用戶 useradd?用戶名 passwd?用戶名 #增加sudo權限 vim?/etc/sudoers #?修改文件里面的 #?root????ALL=(ALL)???????ALL #?用戶名?ALL=(ALL)???????ALL
?
強制關閉進程名包含xxx的所有進程
?
ps?aux|grep?xxx?|?grep?-v?grep?|?awk?'{print?$2}'?|?xargs?kill?-9
?
磁盤,文件,目錄相關操作
vim操作
?
#normal模式下?g表示全局,?x表示查找的內容,?y表示替換后的內容 :%s/x/y/g #normal模式下 0??#?光標移到行首(數字0) $??#?光標移至行尾 shift?+?g?#?跳到文件最后 gg?#?跳到文件頭 #?顯示行號 :set?nu #?去除行號 :set?nonu #?檢索 /xxx(檢索內容)??#?從頭檢索,?按n查找下一個 ?xxx(檢索內容)??#?從尾部檢索
?
打開只讀文件,修改后需要保存時(不用切換用戶即可保存的方式)
?
#?在normal模式下 :w?!sudo?tee?%
?
查看磁盤, 文件目錄基本信息
?
#?查看磁盤掛載情況 mount #?查看磁盤分區信息 df #?查看目錄及子目錄大小 du?-H?-h #?查看當前目錄下各個文件,?文件夾占了多少空間,?不會遞歸 du?-sh?*
?
wc命令
?
#?查看文件里有多少行 wc?-l?filename #?看文件里有多少個word wc?-w?filename #?文件里最長的那一行是多少個字 wc?-L?filename #?統計字節數 wc?-c
?
常用壓縮, 解壓縮命令
壓縮命令
?
tar?czvf?xxx.tar?壓縮目錄 zip?-r?xxx.zip?壓縮目錄
?
解壓縮命令
?
tar?zxvf?xxx.tar #?解壓到指定文件夾 tar?zxvf?xxx.tar?-C?/xxx/yyy/ unzip?xxx.zip
?
變更文件所屬用戶, 用戶組
?
chown?eagleye.eagleye?xxx.log
?
cp, scp, mkdir
?
#復制 cp?xxx.log #?復制并強制覆蓋同名文件 cp?-f?xxx.log #?復制文件夾 cp?-r?xxx(源文件夾)?yyy(目標文件夾) #?遠程復制 scp?-P?ssh端口?username@10.10.10.101:/home/username/xxx?/home/xxx #?級聯創建目錄 mkdir?-p?/xxx/yyy/zzz #?批量創建文件夾,?會在test,main下都創建java,?resources文件夾 mkdir?-p?src/{test,main}/{java,resources}
?
比較兩個文件
?
diff?-u?1.txt?2.txt
?
日志輸出的字節數,可以用作性能測試
?
#?如果做性能測試,?可以每執行一次,?往日志里面輸出?“.”?,?這樣日志中的字節數就是實際的性能測試運行的次數,?還可以看見實時速率. tail?-f?xxx.log?|?pv?-bt
?
查看, 去除特殊字符
?
#?查看特殊字符 cat?-v?xxx.sh #?去除特殊字符 sed?-i?'s/^M//g’?env.sh??去除文件的特殊字符,?比如^M:??需要這樣輸入:?ctrl+v+enter
?
處理因系統原因引起的文件中特殊字符的問題
?
#?可以轉換為該系統下的文件格式 cat?file.sh?>?file.sh_bak #?先將file.sh中文件內容復制下來然后運行,?然后粘貼內容,?最后ctrl?+?d?保存退出 cat?>?file1.sh #?在vim中通過如下設置文件編碼和文件格式 :set?fileencodings=utf-8 ,然后 w (存盤)一下即可轉化為 utf8 格式, :set?fileformat=unix #?在mac下使用dos2unix進行文件格式化 find?.?-name?"*.sh"?|?xargs?dos2unix
?
tee, 重定向的同時輸出到屏幕
?
awk?‘{print?$0}’?xxx.log?|?tee?test.log
?
檢索相關
grep
?
#?反向匹配,?查找不包含xxx的內容 grep?-v?xxx #?排除所有空行 grep?-v?'^/pre> #?返回結果?2,則說明第二行是空行 grep?-n?“^$”?111.txt???? #?查詢以abc開頭的行 grep?-n?“^abc”?111.txt? #?同時列出該詞語出現在文章的第幾行 grep?'xxx'?-n?xxx.log #?計算一下該字串出現的次數 grep?'xxx'?-c?xxx.log #?比對的時候,不計較大小寫的不同 grep?'xxx'?-i?xxx.log
?
awk
?
#?以':'?為分隔符,如果第五域有user則輸出該行 awk?-F?':'?'{if?($5?~?/user/)?print?$0}'?/etc/passwd? #?統計單個文件中某個字符(串)(中文無效)出現的次數 awk?-v?RS='character'?'END?{print?--NR}'?xxx.txt
?
find檢索命令
?
#?在目錄下找后綴是.mysql的文件 find?/home/eagleye?-name?'*.mysql'?-print #?會從?/usr 目錄開始往下找,找最近3天之內存取過的文件。 find?/usr?-atime?3?–print #?會從?/usr 目錄開始往下找,找最近5天之內修改過的文件。 find?/usr?-ctime?5?–print #?會從?/doc 目錄開始往下找,找jacky 的、文件名開頭是 j的文件。?? find?/doc?-user?jacky?-name?'j*'?–print #?會從?/doc 目錄開始往下找,找尋文件名是 ja 開頭或者 ma開頭的文件。 find?/doc?(?-name?'ja*'?-o-?-name?'ma*'?)?–print #??會從?/doc 目錄開始往下找,找到凡是文件名結尾為 bak的文件,把它刪除掉。-exec 選項是執行的意思,rm 是刪除命令,{?}?表示文件名,“;”是規定的命令結尾。? find?/doc?-name?'*bak'?-exec?rm?{}?;
?
網絡相關
查看什么進程使用了該端口
?
lsof?-i:por
?
獲取本機ip地址
?
/sbin/ifconfig?-a|grep?inet|grep?-v?127.0.0.1|grep?-v?inet6|awk?'{print?$2}'|tr?-d?"addr:"
?
iptables
?
#?查看iptables狀態 service?iptables?status #?要封停一個ip iptables?-I?INPUT?-s?***.***.***.***?-j?DROP #?要解封一個IP,使用下面這條命令: iptables?-D?INPUT?-s?***.***.***.***?-j?DROP 備注:?參數-I是表示Insert(添加),-D表示Delete(刪除)。后面跟的是規則,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放棄連接。 #開啟9090端口的訪問 /sbin/iptables?-I?INPUT?-p?tcp?--dport?9090?-j?ACCEPT? #?防火墻開啟、關閉、重啟 /etc/init.d/iptables?status /etc/init.d/iptables?start /etc/init.d/iptables?stop /etc/init.d/iptables?restart
?
nc命令, tcp調試利器
?
#給某一個endpoint發送TCP請求,就將data的內容發送到對端 nc?192.168.0.11?8000??received_data #上邊只監聽一次,如果多次可以加上-k參數 nc?-lk?8000
?
tcpdump
?
#?dump出本機12301端口的tcp包 tcpdump?-i?em1?tcp?port?12301?-s?1500?-w?abc.pcap
?
跟蹤網絡路由路徑
?
#?traceroute默認使用udp方式,?如果是-I則改成icmp方式 traceroute?-I?www.163.com #?從ttl第3跳跟蹤 traceroute?-M?3?www.163.com?? #?加上端口跟蹤 traceroute?-p?8080?192.168.10.11ss #?顯示本地打開的所有端口 ss?-l? #?顯示每個進程具體打開的socket ss?-pl? #?顯示所有tcp?socket ss?-t?-a? #?顯示所有的UDP?Socekt ss?-u?-a? #?顯示所有已建立的SMTP連接 ss?-o?state?established?'(?dport?=?:smtp?or?sport?=?:smtp?)'?? #?顯示所有已建立的HTTP連接? ss?-o?state?established?'(?dport?=?:http?or?sport?=?:http?)'?? #找出所有連接X服務器的進程 ss?-x?src?/tmp/.X11-unix/*?? #列出當前socket統計信息 ss?-s? 解釋:netstat是遍歷/proc下面每個PID目錄,ss直接讀/proc/net下面的統計信息。所以ss執行的時候消耗資源以及消耗的時間都比netstat少很多
?
netstat
?
#?輸出每個ip的連接數,以及總的各個狀態的連接數 netstat?-n?|?awk?'/^tcp/?{n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N}?END?{for(a?in?S){printf("%-20s?%s ",?a,?S[a]);++I}printf("%-20s?%s ","TOTAL_IP",I);for(a?in?s)?printf("%-20s?%s ",a,?s[a]);printf("%-20s?%s ","TOTAL_LINK",N);}' #?統計所有連接狀態,? # CLOSED:無連接是活動的或正在進行 # LISTEN:服務器在等待進入呼叫 # SYN_RECV:一個連接請求已經到達,等待確認 # SYN_SENT:應用已經開始,打開一個連接 # ESTABLISHED:正常數據傳輸狀態 # FIN_WAIT1:應用說它已經完成 # FIN_WAIT2:另一邊已同意釋放 # ITMED_WAIT:等待所有分組死掉 # CLOSING:兩邊同時嘗試關閉 # TIME_WAIT:主動關閉連接一端還沒有等到另一端反饋期間的狀態 # LAST_ACK:等待所有分組死掉 netstat?-n?|?awk?'/^tcp/?{++state[$NF]}?END?{for(key?in?state)?print?key," ",state[key]}' #?查找較多time_wait連接 netstat?-n|grep?TIME_WAIT|awk?'{print?$5}'|sort|uniq?-c|sort?-rn|head?-n20
?
監控linux性能命令
top
按大寫的 F 或 O 鍵,然后按 a-z 可以將進程按照相應的列進行排序, 然后回車。而大寫的 R 鍵可以將當前的排序倒轉。
?
PID?進程id PPID?父進程id RUSER?Real?user?name 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 nFLT?頁面錯誤次數 nDRT 最后一次寫入到現在,被修改過的頁面數。 S 進程狀態。D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/停止,Z=僵尸進程 COMMAND?命令名/命令行 WCHAN?若該進程在睡眠,則顯示睡眠中的系統函數名 Flags?任務標志,參考?sched.h
?
dmesg,查看系統日志
?
dmesg
?
iostat,磁盤IO情況監控
?
iostat?-xz?1 # r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引起性能問題。 # await:IO操作的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,需要消耗的時間,包括IO等待和實際操作的耗時。如果這個數值過大,可能是硬件設備遇到了瓶頸或者出現故障。 # avgqu-sz:向設備發出的請求平均數量。如果這個數值大于1,可能是硬件設備已經飽和(部分前端硬件設備支持并行寫入)。 #?%util:設備利用率。這個數值表示設備的繁忙程度,經驗值是如果超過60,可能會影響IO性能(可以參照IO操作平均等待時間)。如果到達100%,說明硬件設備已經飽和。 #?如果顯示的是邏輯設備的數據,那么設備利用率不代表后端實際的硬件設備已經飽和。值得注意的是,即使IO性能不理想,也不一定意味這應用程序性能會不好,可以利用諸如預讀取、寫緩存等策略提升應用性能。
?
free,內存使用情況
?
free?-m eg: ?????total???????used???????free?????shared????buffers?????cached Mem:??????????1002????????769????????232??????????0?????????62????????421 -/+?buffers/cache:??????????286????????715 Swap:??????????1153??????????0???????1153
?
第一部分Mem行:
?
total?內存總數:?1002M used?已經使用的內存數:?769M free?空閑的內存數:?232M shared?當前已經廢棄不用,總是0 buffers?Buffer?緩存內存數:?62M cached?Page?緩存內存數:421M
?
關系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
?
(-buffers/cache) used內存數:286M (指的第一部分Mem行中的used – buffers – cached) (+buffers/cache)?free內存數:?715M?(指的第一部分Mem行中的free?+?buffers?+?cached)
?
可見-buffers/cache反映的是被程序實實在在吃掉的內存,而+buffers/cache反映的是可以挪用的內存總數.
第三部分是指交換分區
sar,查看網絡吞吐狀態
?
# sar命令在這里可以查看網絡設備的吞吐率。在排查性能問題時,可以通過網絡設備的吞吐量,判斷網絡設備是否已經飽和。 sar?-n?DEV?1 # # sar命令在這里用于查看TCP連接狀態,其中包括: # active/s:每秒本地發起的TCP連接數,既通過connect調用創建的TCP連接; # passive/s:每秒遠程發起的TCP連接數,即通過accept調用創建的TCP連接; # retrans/s:每秒TCP重傳數量; # TCP連接數可以用來判斷性能問題是否由于建立了過多的連接,進一步可以判斷是主動發起的連接,還是被動接受的連接。TCP重傳可能是因為網絡環境惡劣,或者服務器壓力過大導致丟包 sar?-n?TCP,ETCP?1
?
vmstat, 給定時間監控CPU使用率, 內存使用, 虛擬內存交互, IO讀寫
?
# 2表示每2秒采集一次狀態信息, 1表示只采集一次(忽略既是一直采集) vmstat?2?1 eg: r?b?swpd?free?buff?cache?si?so?bi?bo?in?cs?us?sy?id?wa 1?0?0?3499840?315836?3819660?0?0?0?1?2?0?0?0?100?0 0?0?0?3499584?315836?3819660?0?0?0?0?88?158?0?0?100?0 0?0?0?3499708?315836?3819660?0?0?0?2?86?162?0?0?100?0 0?0?0?3499708?315836?3819660?0?0?0?10?81?151?0?0?100?0 1?0?0?3499732?315836?3819660?0?0?0?2?83?154?0?0?100?0
?
r 表示運行隊列(就是說多少個進程真的分配到CPU),我測試的服務器目前CPU比較空閑,沒什么程序在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,服務器的狀態很危險。top的負載類似每秒的運行隊列。如果運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
b 表示阻塞的進程,這個不多說,進程阻塞,大家懂的。
swpd 虛擬內存已使用的大小,如果大于0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器。
free 空閑的物理內存的大小,我的機器內存總共8G,剩余3415M。
buff Linux/Unix系統是用來存儲,目錄里面有什么內容,權限等的緩存,我本機大概占用300多M
cache cache直接用來記憶我們打開的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)
si 每秒從磁盤讀入虛擬內存的大小,如果這個值大于0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。
so 每秒虛擬內存寫入磁盤的大小,如果這個值大于0,同上。
bi 塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什么IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒
bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。
in 每秒CPU的中斷次數,包括時間中斷
cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web服務器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU干正經事的時間少了,CPU沒有充分利用,是不可取的。
us 用戶CPU時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。
sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id 空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。
wt 等待IO CPU時間。
審核編輯:湯梓紅
評論
查看更多