Linux常用命令知識積累(持續更新)
寫在前面
雖然平時大部分工作都是和Java相關的開發, 但是每天都會接觸Linux系統, 尤其是使用了Mac之後, 每天都是工作在黑色背景的命令列環境中. 自己記憶力不好, 很多有用的Linux命令不能很好的記憶, 現在逐漸總結一下, 以便後續檢視.
基本操作
Linux關機,重啟
# 關機
shutdown -h now
# 重啟
shutdown -r now
檢視系統,CPU資訊
# 檢視系統核心資訊
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 '^$'
# 返回結果 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:port
獲取本機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 < data.txt
#nc可以當做伺服器,監聽某個埠號,把某一次請求的內容儲存到received_data裡
nc -l 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.11
ss
# 顯示本地開啟的所有埠
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\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","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,"\t",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時間。
相關文章
- 前端知識點(持續更新)前端
- linux網路知識和工具(持續更新)Linux
- Linux知識積累(長更)Linux
- Linux 常用命令 持續更新Linux
- 日積月累-計算機英語詞彙(持續更新)計算機
- 日常知識積累
- 機器學習知識積累機器學習
- Linux常用命令整理-持續更新Linux
- iOS--小知識點(持續更新)iOS
- 常用前端知識積累前端
- MySQL知識-積累篇MySql
- C++知識點 —— 整合(持續更新中)C++
- js基礎知識積累JS
- java web dev知識積累JavaWebdev
- java知識大全積累篇Java
- java日常知識點積累Java
- ubuntu點選知識積累Ubuntu
- docker 常用命令(持續更新)Docker
- Git 常用命令(持續更新)Git
- Git常用命令 (持續更新)Git
- PHP and laravel知識點小小積累PHPLaravel
- 前端知識體系思維導圖(持續更新...)前端
- 一些有點奇怪的知識(持續更新)
- CentOS 7 常用命令 (持續更新中...)CentOS
- 機器學習數學知識積累總結機器學習
- 開發常識 持續更新~~
- 前端知識點總結——JS高階(持續更新中)前端JS
- Go基礎知識-03 strings strconv(持續更新)Go
- 前端冷知識(持續更新2020.12.13)前端
- [Android學習筆記]雜碎知識(持續更新)Android筆記
- Objective -C基礎知識點整理筆記持續更新......Object筆記
- JAVA學習筆記及知識積累Java筆記
- 機器學習數學知識積累之概率論機器學習
- LINUX進階(持續更新)Linux
- 物聯網平臺的搭建知識要點(持續更新)
- TCP/IP協議重要知識點彙總(持續更新中)TCP協議
- Git 常用命令總結,將會持續更新Git
- Flutter積累一些常用基礎知識Flutter