我們擅長(cháng)商業(yè)策略與用戶(hù)體驗的完美結合。
歡迎瀏覽我們的案例。
基本操作Linux 關(guān)機,重啟
# 關(guān)機shutdown -h now# 重啟shutdown -r now
查看系統,CPU信息
# 查看系統內核信息uname -a# 查看系統內核版本cat /proc/version# 查看當前用戶(hù)環(huán)境變量envcat /proc/cpuinfo# 查看有幾個(gè)邏輯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不支持64bitgetconf LONG_BIT# 結果大于0, 說(shuō)明支持64bit計算. lm指long mode, 支持lm則是64bitcat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
建立軟連接
ln -s /usr/local/jdk1.8/ jdk
rpm相關(guān)
# 查看是否通過(guò)rpm安裝了該軟件rpm -qa | grep 軟件名
sshkey
# 創(chuàng )建sshkeyssh-keygen -t rsa -C your_email@example.com#id_rsa.pub 的內容拷貝到要控制的服務(wù)器的 home/username/.ssh/authorized_keys 中,如果沒(méi)有則新建(.ssh權限為700, authorized_keys權限為600)
命令重命名
# 在各個(gè)用戶(hù)的.bash_profile中添加重命名配置alias ll='ls -alF'
同步服務(wù)器時(shí)間
sudo ntpdate -u ntp.api.bz
后臺運行命令
# 后臺運行,并且有nohup.out輸出nohup xxx &# 后臺運行, 不輸出任何日志nohup xxx > /dev/null &# 后臺運行, 并將錯誤信息做標準輸出到日志中 nohup xxx >out.log 2>&1 &
強制活動(dòng)用戶(hù)退出
# 命令來(lái)完成強制活動(dòng)用戶(hù)退出.其中TTY表示終端名稱(chēng)pkill -kill -t [TTY]
查看命令路徑
which <命令>
查看進(jìn)程所有打開(kāi)最大fd數
ulimit -n
配置dns
vim /etc/resolv.conf
nslookup,查看域名路由表
nslookup google.com
last, 最近登錄信息列表
# 最近登錄的5個(gè)賬號last -n 5
設置固定ip
ifconfig em1 192.168.5.177 netmask 255.255.255.0
查看進(jìn)程內加載的環(huán)境變量
# 也可以去 cd /proc 目錄下, 查看進(jìn)程內存中加載的東西ps eww -p XXXXX(進(jìn)程號)
查看進(jìn)程樹(shù)找到服務(wù)器進(jìn)程
ps auwxf
查看進(jìn)程啟動(dòng)路徑
cd /proc/xxx(進(jìn)程號)ls -all# cwd對應的是啟動(dòng)路徑
添加用戶(hù), 配置sudo權限
# 新增用戶(hù)useradd 用戶(hù)名passwd 用戶(hù)名#增加sudo權限vim /etc/sudoers# 修改文件里面的# root ALL=(ALL) ALL# 用戶(hù)名 ALL=(ALL) ALL
強制關(guān)閉進(jìn)程名包含xxx的所有進(jìn)程
ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
磁盤(pán),文件,目錄相關(guān)操作vim操作
#normal模式下 g表示全局, x表示查找的內容, y表示替換后的內容:%s/x/y/g#normal模式下0 # 光標移到行首(數字0)$ # 光標移至行尾shift + g # 跳到文件最后gg # 跳到文件頭# 顯示行號:set nu# 去除行號:set nonu# 檢索/xxx(檢索內容) # 從頭檢索, 按n查找下一個(gè)?xxx(檢索內容) # 從尾部檢索
打開(kāi)只讀文件,修改后需要保存時(shí)(不用切換用戶(hù)即可保存的方式)
# 在normal模式下:w !sudo tee %
查看磁盤(pán), 文件目錄基本信息
# 查看磁盤(pán)掛載情況mount# 查看磁盤(pán)分區信息df# 查看目錄及子目錄大小du -H -h# 查看當前目錄下各個(gè)文件, 文件夾占了多少空間, 不會(huì )遞歸du -sh *
wc命令
# 查看文件里有多少行wc -l filename# 看文件里有多少個(gè)wordwc -w filename# 文件里最長(cháng)的那一行是多少個(gè)字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
變更文件所屬用戶(hù), 用戶(hù)組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# 級聯(lián)創(chuàng )建目錄mkdir -p /xxx/yyy/zzz# 批量創(chuàng )建文件夾, 會(huì )在test,main下都創(chuàng )建java, resources文件夾mkdir -p src/{test,main}/{java,resources}
比較兩個(gè)文件
diff -u 1.txt 2.txt
日志輸出的字節數,可以用作性能測試
# 如果做性能測試, 可以每執行一次, 往日志里面輸出 “.” , 這樣日志中的字節數就是實(shí)際的性能測試運行的次數, 還可以看見(jiàn)實(shí)時(shí)速率.tail -f xxx.log | pv -bt
查看, 去除特殊字符
# 查看特殊字符cat -v xxx.sh# 去除特殊字符sed -i 's/^M//g’ env.sh 去除文件的特殊字符, 比如^M: 需要這樣輸入: ctrl+v+enter
處理因系統原因引起的文件中特殊字符的問(wèn)題
# 可以轉換為該系統下的文件格式cat file.sh > file.sh_bak# 先將file.sh中文件內容復制下來(lái)然后運行, 然后粘貼內容, 最后ctrl + d 保存退出cat > file1.sh# 在vim中通過(guò)如下設置文件編碼和文件格式:set fileencodings=utf-8 ,然后 w (存盤(pán))一下即可轉化為 utf8 格式,:set fileformat=unix# 在mac下使用dos2unix進(jìn)行文件格式化find . -name "*.sh" | xargs dos2unix
tee, 重定向的同時(shí)輸出到屏幕
awk ‘{print $0}’ xxx.log | tee test.log
檢索相關(guān)grep(每天學(xué)一個(gè) Linux 命令(5):grep)
# 反向匹配, 查找不包含xxx的內容grep -v xxx# 排除所有空行g(shù)rep -v '^/pre># 返回結果 2,則說(shuō)明第二行是空行g(shù)rep -n “^$” 111.txt # 查詢(xún)以abc開(kāi)頭的行g(shù)rep -n “^abc” 111.txt # 同時(shí)列出該詞語(yǔ)出現在文章的第幾行g(shù)rep 'xxx' -n xxx.log# 計算一下該字串出現的次數grep 'xxx' -c xxx.log# 比對的時(shí)候,不計較大小寫(xiě)的不同grep 'xxx' -i xxx.log
awk(每天一個(gè) Linux 命令(4):awk)
# 以':' 為分隔符,如果第五域有user則輸出該行awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd # 統計單個(gè)文件中某個(gè)字符(串)(中文無(wú)效)出現的次數awk -v RS='character' 'END {print --NR}' xxx.txt
find檢索命令(每天學(xué)一個(gè) Linux 命令(20):find)
# 在目錄下找后綴是.mysql的文件find /home/eagleye -name '*.mysql' -print# 會(huì )從 /usr 目錄開(kāi)始往下找,找最近3天之內存取過(guò)的文件。find /usr -atime 3 –print# 會(huì )從 /usr 目錄開(kāi)始往下找,找最近5天之內修改過(guò)的文件。find /usr -ctime 5 –print# 會(huì )從 /doc 目錄開(kāi)始往下找,找jacky 的、文件名開(kāi)頭是 j的文件。 find /doc -user jacky -name 'j*' –print# 會(huì )從 /doc 目錄開(kāi)始往下找,找尋文件名是 ja 開(kāi)頭或者 ma開(kāi)頭的文件。find /doc \( -name 'ja*' -o- -name 'ma*' \) –print# 會(huì )從 /doc 目錄開(kāi)始往下找,找到凡是文件名結尾為 bak的文件,把它刪除掉。-exec 選項是執行的意思,rm 是刪除命令,{ } 表示文件名,“\;”是規定的命令結尾。 find /doc -name '*bak' -exec rm {} \;
網(wǎng)絡(luò )相關(guān)查看什么進(jìn)程使用了該端口
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狀態(tài)service iptables status# 要封停一個(gè)ipiptables -I INPUT -s ***.***.***.*** -j DROP# 要解封一個(gè)IP,使用下面這條命令:iptables -D INPUT -s ***.***.***.*** -j DROP備注: 參數-I是表示Insert(添加),-D表示Delete(刪除)。后面跟的是規則,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放棄連接。#開(kāi)啟9090端口的訪(fǎng)問(wèn)/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT # 防火墻開(kāi)啟、關(guān)閉、重啟/etc/init.d/iptables status/etc/init.d/iptables start/etc/init.d/iptables stop/etc/init.d/iptables restart
nc命令, tcp調試利器
#給某一個(gè)endpoint發(fā)送TCP請求,就將data的內容發(fā)送到對端nc 192.168.0.11 8000 < data.txt#nc可以當做服務(wù)器,監聽(tīng)某個(gè)端口號,把某一次請求的內容存儲到received_data里nc -l 8000 > received_data#上邊只監聽(tīng)一次,如果多次可以加上-k參數nc -lk 8000
tcpdump(每天學(xué)一個(gè) Linux 命令(72):tcpdump)
# dump出本機12301端口的tcp包tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap
跟蹤網(wǎng)絡(luò )路由路徑
# traceroute默認使用udp方式, 如果是-I則改成icmp方式traceroute -I www.163.com# 從ttl第3跳跟蹤traceroute -M 3 www.163.com # 加上端口跟蹤traceroute -p 8080 192.168.10.11ss# 顯示本地打開(kāi)的所有端口ss -l # 顯示每個(gè)進(jìn)程具體打開(kāi)的socketss -pl # 顯示所有tcp socketss -t -a # 顯示所有的UDP Socektss -u -a # 顯示所有已建立的SMTP連接ss -o state established '( dport = :smtp or sport = :smtp )' # 顯示所有已建立的HTTP連接 ss -o state established '( dport = :http or sport = :http )' #找出所有連接X(jué)服務(wù)器的進(jìn)程ss -x src /tmp/.X11-unix/* #列出當前socket統計信息ss -s 解釋?zhuān)簄etstat是遍歷/proc下面每個(gè)PID目錄,ss直接讀/proc/net下面的統計信息。所以ss執行的時(shí)候消耗資源以及消耗的時(shí)間都比netstat少很多
netstat
# 輸出每個(gè)ip的連接數,以及總的各個(gè)狀態(tài)的連接數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);}'# 統計所有連接狀態(tài), # CLOSED:無(wú)連接是活動(dòng)的或正在進(jìn)行# LISTEN:服務(wù)器在等待進(jìn)入呼叫# SYN_RECV:一個(gè)連接請求已經(jīng)到達,等待確認# SYN_SENT:應用已經(jīng)開(kāi)始,打開(kāi)一個(gè)連接# ESTABLISHED:正常數據傳輸狀態(tài)# FIN_WAIT1:應用說(shuō)它已經(jīng)完成# FIN_WAIT2:另一邊已同意釋放# ITMED_WAIT:等待所有分組死掉# CLOSING:兩邊同時(shí)嘗試關(guān)閉# TIME_WAIT:主動(dòng)關(guān)閉連接一端還沒(méi)有等到另一端反饋期間的狀態(tài)# 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
按大寫(xiě)的 F 或 O 鍵,然后按 a-z 可以將進(jìn)程按照相應的列進(jìn)行排序, 然后回車(chē)。而大寫(xiě)的 R 鍵可以將當前的排序倒轉。每天學(xué)一個(gè) Linux 命令(48):top
PID 進(jìn)程idPPID 父進(jìn)程idRUSER Real user nameUID 進(jìn)程所有者的用戶(hù)idUSER 進(jìn)程所有者的用戶(hù)名GROUP 進(jìn)程所有者的組名TTY 啟動(dòng)進(jìn)程的終端名。不是從終端啟動(dòng)的進(jìn)程則顯示為 ?PR 優(yōu)先級NI nice值。負值表示高優(yōu)先級,正值表示低優(yōu)先級P 最后使用的CPU,僅在多CPU環(huán)境下有意義%CPU 上次更新到現在的CPU時(shí)間占用百分比TIME 進(jìn)程使用的CPU時(shí)間總計,單位秒TIME+ 進(jìn)程使用的CPU時(shí)間總計,單位1/100秒%MEM 進(jìn)程使用的物理內存百分比VIRT 進(jìn)程使用的虛擬內存總量,單位kb。VIRT=SWAP+RESSWAP 進(jìn)程使用的虛擬內存中,被換出的大小,單位kb。RES 進(jìn)程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATACODE 可執行代碼占用的物理內存大小,單位kbDATA 可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kbSHR 共享內存大小,單位kbnFLT 頁(yè)面錯誤次數nDRT 最后一次寫(xiě)入到現在,被修改過(guò)的頁(yè)面數。S 進(jìn)程狀態(tài)。D=不可中斷的睡眠狀態(tài),R=運行,S=睡眠,T=跟蹤/停止,Z=僵尸進(jìn)程COMMAND 命令名/命令行WCHAN 若該進(jìn)程在睡眠,則顯示睡眠中的系統函數名Flags 任務(wù)標志,參考 sched.h
dmesg,查看系統日志
dmesg
iostat,磁盤(pán)IO情況監控
iostat -xz 1# r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫(xiě)次數和每秒讀寫(xiě)數據量(千字節)。讀寫(xiě)量過(guò)大,可能會(huì )引起性能問(wèn)題。# await:IO操作的平均等待時(shí)間,單位是毫秒。這是應用程序在和磁盤(pán)交互時(shí),需要消耗的時(shí)間,包括IO等待和實(shí)際操作的耗時(shí)。如果這個(gè)數值過(guò)大,可能是硬件設備遇到了瓶頸或者出現故障。# avgqu-sz:向設備發(fā)出的請求平均數量。如果這個(gè)數值大于1,可能是硬件設備已經(jīng)飽和(部分前端硬件設備支持并行寫(xiě)入)。# %util:設備利用率。這個(gè)數值表示設備的繁忙程度,經(jīng)驗值是如果超過(guò)60,可能會(huì )影響IO性能(可以參照IO操作平均等待時(shí)間)。如果到達100%,說(shuō)明硬件設備已經(jīng)飽和。# 如果顯示的是邏輯設備的數據,那么設備利用率不代表后端實(shí)際的硬件設備已經(jīng)飽和。值得注意的是,即使IO性能不理想,也不一定意味這應用程序性能會(huì )不好,可以利用諸如預讀取、寫(xiě)緩存等策略提升應用性能。
free,內存使用情況free -meg: total used free shared buffers cachedMem: 1002 769 232 0 62 421-/+ buffers/cache: 286 715Swap: 1153 0 1153
第一部分Mem行:
total 內存總數: 1002Mused 已經(jīng)使用的內存數: 769Mfree 空閑的內存數: 232Mshared 當前已經(jīng)廢棄不用,總是0buffers Buffer 緩存內存數: 62Mcached Page 緩存內存數:421M
關(guān)系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used內存數:286M (指的第一部分Mem行中的used – buffers – cached)(+buffers/cache) free內存數: 715M (指的第一部分Mem行中的free + buffers + cached)
可見(jiàn)-buffers/cache反映的是被程序實(shí)實(shí)在在吃掉的內存,而+buffers/cache反映的是可以挪用的內存總數.
第三部分是指交換分區
sar,查看網(wǎng)絡(luò )吞吐?tīng)顟B(tài)
# sar命令在這里可以查看網(wǎng)絡(luò )設備的吞吐率。在排查性能問(wèn)題時(shí),可以通過(guò)網(wǎng)絡(luò )設備的吞吐量,判斷網(wǎng)絡(luò )設備是否已經(jīng)飽和。sar -n DEV 1## sar命令在這里用于查看TCP連接狀態(tài),其中包括:# active/s:每秒本地發(fā)起的TCP連接數,既通過(guò)connect調用創(chuàng )建的TCP連接;# passive/s:每秒遠程發(fā)起的TCP連接數,即通過(guò)accept調用創(chuàng )建的TCP連接;# retrans/s:每秒TCP重傳數量;# TCP連接數可以用來(lái)判斷性能問(wèn)題是否由于建立了過(guò)多的連接,進(jìn)一步可以判斷是主動(dòng)發(fā)起的連接,還是被動(dòng)接受的連接。TCP重傳可能是因為網(wǎng)絡(luò )環(huán)境惡劣,或者服務(wù)器壓力過(guò)大導致丟包sar -n TCP,ETCP 1
vmstat, 給定時(shí)間監控CPU使用率, 內存使用, 虛擬內存交互, IO讀寫(xiě)
# 2表示每2秒采集一次狀態(tài)信息, 1表示只采集一次(忽略既是一直采集)vmstat 2 1eg:r b swpd free buff cache si so bi bo in cs us sy id wa1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 00 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 00 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 00 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 01 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
r 表示運行隊列(就是說(shuō)多少個(gè)進(jìn)程真的分配到CPU),我測試的服務(wù)器目前CPU比較空閑,沒(méi)什么程序在跑,當這個(gè)值超過(guò)了CPU數目,就會(huì )出現CPU瓶頸了。這個(gè)也和top的負載有關(guān)系,一般負載超過(guò)了3就比較高,超過(guò)了5就高,超過(guò)了10就不正常了,服務(wù)器的狀態(tài)很危險。top的負載類(lèi)似每秒的運行隊列。如果運行隊列過(guò)大,表示你的CPU很繁忙,一般會(huì )造成CPU使用率很高。
b 表示阻塞的進(jìn)程,這個(gè)不多說(shuō),進(jìn)程阻塞,大家懂的。
swpd 虛擬內存已使用的大小,如果大于0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務(wù)遷移到其他機器。
free 空閑的物理內存的大小,我的機器內存總共8G,剩余3415M。
buff Linux/Unix系統是用來(lái)存儲,目錄里面有什么內容,權限等的緩存,我本機大概占用300多M
cache cache直接用來(lái)記憶我們打開(kāi)的文件,給文件做緩沖,我本機大概占用300多M(這里是Linux/Unix的聰明之處,把空閑的物理內存的一部分拿來(lái)做文件和目錄的緩存,是為了提高 程序執行的性能,當程序使用內存時(shí),buffer/cached會(huì )很快地被使用。)
si 每秒從磁盤(pán)讀入虛擬內存的大小,如果這個(gè)值大于0,表示物理內存不夠用或者內存泄露了,要查找耗內存進(jìn)程解決掉。我的機器內存充裕,一切正常。
so 每秒虛擬內存寫(xiě)入磁盤(pán)的大小,如果這個(gè)值大于0,同上。
bi 塊設備每秒接收的塊數量,這里的塊設備是指系統上所有的磁盤(pán)和其他塊設備,默認塊大小是1024byte,我本機上沒(méi)什么IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過(guò)可以達到140000/s,磁盤(pán)寫(xiě)入速度差不多140M每秒
bo 塊設備每秒發(fā)送的塊數量,例如我們讀取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO過(guò)于頻繁,需要調整。
in 每秒CPU的中斷次數,包括時(shí)間中斷
cs 每秒上下文切換次數,例如我們調用系統函數,就要進(jìn)行上下文切換,線(xiàn)程的切換,也要進(jìn)程上下文切換,這個(gè)值要越小越好,太大了,要考慮調低線(xiàn)程或者進(jìn)程的數目,例如在apache和nginx這種web服務(wù)器中,我們一般做性能測試時(shí)會(huì )進(jìn)行幾千并發(fā)甚至幾萬(wàn)并發(fā)的測試,選擇web服務(wù)器的進(jìn)程可以由進(jìn)程或者線(xiàn)程的峰值一直下調,壓測,直到cs到一個(gè)比較小的值,這個(gè)進(jìn)程和線(xiàn)程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會(huì )進(jìn)入內核空間,導致上下文切換,這個(gè)是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過(guò)多表示你的CPU大部分浪費在上下文切換,導致CPU干正經(jīng)事的時(shí)間少了,CPU沒(méi)有充分利用,是不可取的。
us 用戶(hù)CPU時(shí)間,我曾經(jīng)在一個(gè)做加密解密很頻繁的服務(wù)器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。
sy 系統CPU時(shí)間,如果太高,表示系統調用時(shí)間長(cháng),例如是IO操作頻繁。
id 空閑 CPU時(shí)間,一般來(lái)說(shuō),id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶(hù)CPU使用率,sy是系統CPU使用率。
wt 等待IO CPU時(shí)間。
?。?a href="http://www.wxlp666.cn/wechat/">邯鄲小程序開(kāi)發(fā))
小米應用商店發(fā)布消息稱(chēng) 持續開(kāi)展“APP 侵害用戶(hù)權益治理”系列行動(dòng) 11:37:04
騰訊云與CSIG成立政企業(yè)務(wù)線(xiàn) 加速數字技術(shù)在實(shí)體經(jīng)濟中的落地和應用 11:34:49
樂(lè )視回應還有400多人 期待新的朋友加入 11:29:25
亞馬遜表示 公司正在將其智能購物車(chē)擴展到馬薩諸塞州的一家全食店 10:18:04
三星在元宇宙平臺推出游戲 玩家可收集原材料制作三星產(chǎn)品 09:57:29
特斯拉加州San Mateo裁減229名員工 永久關(guān)閉該地區分公司 09:53:13