用猿大師VLC播放程式在高版本Chrome、Firefox、Edge等瀏覽器中低延遲播放海康威視、大華攝像頭RTSP視訊流(圖文教程)
Linux下檢視日誌用到的常用命令
殺殭屍程序 部分程式設計師,肯定喜歡下面命令:
ps -ef | grep java (先查java程序ID)
kill -9 PID(生產環境謹慎使用)
kill、killall、pkill命令的區別
kill:通過pid來殺死程序
killall (killall [引數] [程序名]):Linux系統中的killall命令用於殺死指定名字的程序(kill processes by name)。我們可以使用kill命令殺死指定程序PID的程序,如果要找到我們需要殺死的程序,我們還需要在之前使用ps等命令再配合grep來查詢程序,而killall把這兩個過程合二為一,是一個很好用的命令。
pkill:pkill 和killall 應用方法差不多,也是直接殺死執行中的程式;如果你想殺掉單個程序,請用kill 來殺掉。例子: pkill -9 firefox
1.檢視日誌常用命令
tail:
-n 是顯示行號;相當於nl命令;例子如下:
tail -100f test.log 實時監控100行日誌
tail -n 10 test.log 查詢日誌尾部最後10行的日誌;
tail -n +10 test.log 查詢10行之後的所有日誌;
head:
跟tail是相反的,tail是看後多少行日誌;例子如下:
head -n 10 test.log 查詢日誌檔案中的頭10行日誌;
head -n -10 test.log 查詢日誌檔案除了最後10行的其他所有日誌;
cat:
tac是倒序檢視,是cat單詞反寫;例子如下:
cat -n test.log |grep "debug" 查詢關鍵字的日誌
2.應用場景一:按行號檢視---過濾出關鍵字附近的日誌
1)cat -n test.log |grep "debug" 得到關鍵日誌的行號
2)通常查找出錯誤日誌 cat error.log | grep 'nick' , 這時候我們還有個需求就是輸出當前這個日誌的前後幾行:
cat error.log | grep -B 5 'nick' 顯示nick及前5行
cat error.log | grep -A 5 'nick' 顯示nick及後5行
cat error.log | grep -C 5 'nick' 顯示file檔案裡匹配nick字串那行以及上下5行
cat error.log | grep -n -B10 -A10 5 'nick' 顯示file檔案裡匹配nick字串前後10行
3.應用場景二:選取日誌中特定範圍進行分析
1)cat -n test.log |tail -n +1000|head -n 20 從第1000行開始,顯示20行
tail -n +1000表示查詢1000行之後的日誌
head -n 20 則表示在前面的查詢結果裡再查前20條記錄
2)cat catalina.out | head -n 1400| tail -n +1350 顯示1350行到1400行 (實現原理都差不多,就是通過語法糖)
(1)按日期擷取 :一般在日誌系統中都會記錄列印日誌的時間,通常我們非常需要查詢指定時間端的日誌:
sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log
特別說明:該命令中的兩個日期值必須是日誌檔案中包含的值,否則該命令無效.; 先 grep '2014-12-17 16:17:20' test.log 來確定日誌中是否有該 時間點
(2)按行數擷取
sed -n ‘10000,20000p’ test.log
sed -i '/關鍵詞/d' catalina.out 刪除包含關鍵詞的行
4.應用場景三:日誌內容特別多,列印在螢幕上不方便檢視
(1)使用more和less命令,
如: cat -n test.log |grep "debug" |more 這樣就分頁列印了,通過點選空格鍵翻頁
(2)使用 >xxx.txt 將其儲存到檔案中,到時可以拉下這個檔案分析
如:cat -n test.log |grep "debug" >debug.txt
- 使用管道進行and or條件處理
and 使用管道實現 例如: grep -n '日誌排查' test.log | grep '日誌'
or 用-E 例如:grep -n -E '日誌排查|hello' test.log 滿足兩個關鍵字的都可以找出來
5.如何看查佔用cpu最多的程序?
方法一
核心指令:ps
實際命令:
ps H -eo pid,pcpu | sort -nk2 | tail
執行效果如下:
[work@test01 ~]$ ps H -eo pid,pcpu | sort -nk2 | tail
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
31396 0.6
30904 1.0
30914 1.0
結果:
瞧見了吧,最耗cpu的pid=30914。
畫外音:實際上是31396。
**方法二
**
核心指令:top
實際命令:
top
Shift + t
top 命令類似於 Windows 的工作管理員,能夠顯示 Linux 系統中執行的程序的動態實時檢視。
預設情況下,top 輸出結果是按 CPU 佔用進行排序,每 5s 更新一次結果。我們可以使用 top-b|head-50
顯示排前 50 的佔用 CPU 最高的程序( Linux 中如何找出 CPU 佔用高的程序
)。
上面的命令解釋如下:
- -b:批次檔模式
- head -50:顯示輸出結果的前 50 個
- PID:程序的 ID
- USER:程序的歸屬者
- PR:程序的等級
- NI:程序的 NICE 值
- VIRT:程序使用的虛擬記憶體
- RES:程序使用的實體記憶體
- SHR:程序使用的共享記憶體
- S:這個值表示程序的狀態: S = 睡眠,R = 執行,Z = 殭屍程序
- %CPU:程序佔用的 CPU 比例
- %MEM:程序使用的 RAM 比例
- TIME+:程序運行了多長時間
- COMMAND:程序名字
如果想看程序的完整資訊,可以加 -c 引數,如 top-b-c|head-50
6.使用 ps
ps 就是程序狀態的縮寫,可以顯示當前執行程序的詳細資訊,如使用者名稱、使用者 ID、CPU 使用率、記憶體使用、程序啟動日期時間、命令名等等。
使用 ps-eo pid,ppid,%mem,%cpu,cmd--sort=-%cpu|head
可以顯示佔用 CPU 較高的程序資訊(注意 --sort=-%cpu
)。如下:
# ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head
PID PPID %MEM %CPU CMD
18527 1714 4.2 40.3 /usr/lib/firefox/firefox -contentproc -childID 18 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
1714 1152 5.6 8.0 /usr/lib/firefox/firefox --new-window
18324 1714 4.9 6.3 /usr/lib/firefox/firefox -contentproc -childID 16 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
3286 1714 2.0 5.1 /usr/lib/firefox/firefox -contentproc -childID 14 -isForBrowser -prefsLen 8078 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
1783 1714 3.0 4.5 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
1227 1152 2.3 2.5 /usr/bin/gnome-shell
1170 1168 3.5 2.2 /usr/lib/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
16865 1714 2.5 2.1 /usr/lib/firefox/firefox -contentproc -childID 15 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
2179 1714 2.7 1.8 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 7821 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab
上命令的解釋如下:
- -e:選擇所有程序
- -o:自定義輸出格式
- –sort=-%cpu:基於 CPU 使用率對輸出結果排序
- head:顯示結果的前 10 行
- PID:程序的 ID
- PPID:父程序的 ID
- %MEM:程序使用的 RAM 比例
- %CPU:程序佔用的 CPU 比例
- Command:程序名字
如果想看命令名字而不是命令的絕對路徑,可以:
7.找到了最耗CPU的程序ID,對應的服務名是什麼呢?
方法一
核心指令:ps
實際命令:
ps aux | fgrep pid
執行效果如下:
[work@test01 ~]$ ps aux | fgrep 30914
work 30914 1.0 0.8 309568 71668 ? Sl Feb02 124:44 ./router2 –conf=rs.conf
結果:
瞧見了吧,程序是./router2
畫外音: grep 和fgrep的區別?
兩者都是搜尋工具,但功能上有區別。
1,首先,grep支援的是標準正則表示式。
2,fgrep,不支援正則表示式,只用於匹配固定字串。
所以後者要比前者速度快,當然同時後者的搜尋功能要弱於前者。
方法二
直接查proc即可。
實際命令:
ll /proc/pid
執行效果如下:
[work@test01 ~]$ ll /proc/30914
lrwxrwxrwx 1 work work 0 Feb 10 13:27 cwd -> /home/work/im-env/router2
lrwxrwxrwx 1 work work 0 Feb 10 13:27 exe -> /home/work/im-env/router2/router2
畫外音:這個好,全路徑都出來了。
8.如何檢視某個埠的連線情況?
方法一
核心指令:netstat
實際命令:
netstat -lap | fgrep port
執行效果如下:
[work@test01 ~]$ netstat -lap | fgrep 22022
tcp 0 0 10.58.xxx.29:22022 *: ** LISTEN 31396/imui*
tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46642 ESTABLISHED 31396/imui
tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46640 ESTABLISHED 31396/imui
方法二
核心指令:lsof
實際命令:
lsof -i :port
執行效果如下:
[work@test01 ~]$ /usr/sbin/lsof -i :22022
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
router 30904 work 50u IPv4 69065770 TCP 10.58.xxx.29:46638->10.58.xxx.29:22022 (ESTABLISHED)
router 30904 work 51u IPv4 69065772 TCP 10.58.xxx.29:46639->10.58.xxx.29:22022 (ESTABLISHED)
router 30904 work 52u IPv4 69065774 TCP 10.58.xxx.29:46640->10.58.xxx.29:22022 (ESTABLISHED)
9.歸檔壓縮檔案匯出指定內容到檔案
命令: zcat 壓縮檔案 |grep '關鍵詞' > 111.txt
注:>> 為追加;> 為重定向,會覆蓋原先的內容
10.查詢關鍵字及其前後的資訊
- 根據關鍵字檢視日誌
cat hrun.log | grep "新增使用者"
- 根據關鍵字檢視後10行日誌
cat hrun.log | grep "新增使用者" -A 10
- 根據關鍵字檢視前10行日誌
cat hrun.log | grep "新增使用者" -B 10
- 根據關鍵字檢視前後10行日誌,並顯示出行號
cat -n hrun.log | grep "新增使用者" -C 10
- 檢視日誌前 50 行
cat hrun.log | head -n 50
- 檢視日誌後 50 行,並顯示出行號
cat -n hrun.log | tail -n 50
說明:
-A 表示關鍵字之後,After
-B 表示關鍵字之前,Before
-C 表示關鍵字前後,Context
11.nohup的作用
nohup命令:如果你正在執行一個程序,而且你覺得在退出帳戶時或者關閉客戶端該程序還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續執行相應的程序。在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的檔案中。
nohup command > myout.file 2>&1 &
在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
2>&1是將標準錯誤(2)重定向到標準輸出(&1),標準輸出(&1)再被重定向輸入到myout.file檔案中。
1.nohup和&的區別
& : 指在後臺執行
nohup : nohup執行命令可以使命令永久的執行下去,和使用者終端沒有關係,例如我們斷開SSH連線都不會影響他的執行,注意了nohup沒有後臺執行的意思;&才是後臺執行,
&是指在後臺執行,但當用戶退出(掛起)的時候,命令自動也跟著退出
nohup可以使用Ctrl+C結束掉,而&使用Ctrl+C則結束不掉,nohup不受終端關閉,使用者退出影響,而&則受終端關閉,使用者退出影響
結合起來用就是
nohup COMMAND &
12.Linux PATH環境變數及作用
在講解 PATH 環境變數之前,首先介紹一下 which 命令,它用於查詢某個命令所在的絕對路徑。例如:
[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/bin/ls
注意,ls 是一個相對特殊的命令,它使用 alias 命令做了別名,也就是說,我們常用的 ls 實際上執行的是 ls --color=auto。
通過使用 which 命令,可以查詢各個外部命令(和 Shell 內建命令相對)所在的絕對路徑。學到這裡,讀者是否有這樣一個疑問,為什麼前面在使用 rm、rmdir、ls 等命令時,無論當前位於哪個目錄,都可以直接使用,而無需指明命令的執行檔案所在的位置(絕對路徑)呢?其實,這是 PATH 環境變數在起作用。
首先,執行如下命令:
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin
這裡的 echo 命令用來輸出 PATH 環境變數的值(這裡的 $ 是 PATH 的字首符號),PATH 環境變數的內容是由一堆目錄組成的,各目錄之間用冒號“:”隔開。當執行某個命令時,Linux 會依照 PATH 中包含的目錄依次搜尋該命令的可執行檔案,一旦找到,即正常執行;反之,則提示無法找到該命令。
如果在 PATH 包含的目錄中,有多個目錄都包含某命令的可執行檔案,那麼會執行先搜尋到的可執行檔案。
從執行結果中可以看到,/bin 目錄已經包含在 PATH 環境變數中,因此在使用類似 rm、rmdir、ls等命令時,即便直接使用其命令名,Linux 也可以找到該命令。
為了印證以上觀點,下面舉個反例,如果我們將 ls 命令移動到 /root 目錄下,由於 PATH 環境變數中沒有包含此目錄,所有當直接使用 ls 命令名執行時,Linux 將無法找到此命令的可執行檔案,並提示 No such file or directory,示例命令如下:
[root@localhost ~]# mv /bin/ls /root
[root@localhost ~]# ls
bash: /bin/ls: No such file or directory
此時,如果仍想使用 ls 命令,有 2 種方法,一種是直接將 /root 新增到 PATH 環境變數中,例如:
[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[root@localhost ~]# ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
注意,這種方式只是臨時有效,一旦退出下次再登陸的時候,$PATH 就恢復成了預設值。
另一種方法是以絕對路徑的方式使用此命令,例如:
[root@localhost ~]# /root/ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
為了不影響系統的正常使用,強烈建議大家將移動後的 ls 檔案還原,命令如下:
[root@localhost ~]# mv /root/ls /bin