殺死殭屍程序,你需要這些神奇高效的Linux命令列

2021-09-11 06:26:31 字數 3124 閱讀 9421

linux高手,其實都是玩兒命令列很熟練的人。

命令列的學習捷徑

linux命令有許多強大的功能:從簡單的磁碟操作、檔案訪問,到進行複雜的多**影象和流**檔案的製作,都離不開命令列。

在linux的學習中,新手都會遇到這麼乙個問題:自己對系統的每個命令都很熟悉,但是在系統出現故障的時候,就無從下手了。

說到底,就是學習的理論知識沒有很好地與系統實際操作相結合。

5大系統運維狀態

對運維來說,檢視系統執行狀態是最基礎的工作之一。

要了解cpu、記憶體、程序、磁碟、網路,這五大運維系統的執行狀態,需要掌握的運維命令有ls、ps、free、top、uptime、ifconfig、su/sudo、dmesg、iostat、vmstat、sar、htop、iotop、smem等命令。

這些命令有的非常簡單,不做過多介紹,重點介紹幾個高效、神奇的命令,它能幫助我們快速了解系統執行狀態,絕對是運維神器。

典型linux命令列

linux使用到了虛擬記憶體,因此要準確的計算乙個程序實際使用的物理記憶體就不是那麼簡單。

smem 是一款命令列下的記憶體使用情況報告工具,它能夠給使用者提供 linux 系統下的記憶體使用的多種報告。

記憶體狀態檢測工具

要安裝smem這個工具,需要在系統上安裝epel軟體源,安裝過程如下:

[root@localhost ~]# yum install epel-release

[root@localhost ~]# yum install smem

要顯示系統中每個程序的占用記憶體狀態,可執行如下圖指令:

上圖中,「-k」引數用來顯示記憶體單位,「-s」是排序,uss是對uss列進行排序,這樣,就輸出了系統中所有進行占用的記憶體大小,非常清晰明白。

smem還支援以百分比形式顯示每個程序占用系統記憶體的比率,如下圖所示:

其中,「-p」表示以百分比的形式報告記憶體使用情況,這樣每個程序占用的系統記憶體比重一目了然。

smem還可以顯示系統中每乙個使用者的記憶體使用情況,如下圖所示:

其中,「-u」表示顯示使用者占用記憶體資訊。

最後,smem還支援檢視某個程序占用記憶體大小,例如:

smem -p nginx 

smem -k -p nginx

由此可知,通過smem,對每個程序占用的記憶體資源可以很輕鬆的獲取。絕對是運維必備工具。

cpu/記憶體占用程序

這個應用需求在伺服器的問題排查和故障處理上使用率非常高,要獲取這些資訊,只需要一些命令組合即可實現,可以說非常簡單。

首先,獲取當前系統占用cpu最高的前10個程序最簡單的方式是通過ps命令組合實現,例如:

[root@localhost ~]# ps aux|head -1;ps aux|sort -rn -k3|head -10
其中,第一句主要是為了獲取標題(user pid %cpu %mem vsz rss tty stat start time command)資訊。而「head:-n」可以指定顯示的行數,預設顯示10行。

第二個命令是乙個輸出加排序組合,ps引數的a指代all,表示所有的程序,u指代user id,就是執行該程序的使用者id,x指代顯示所有程式,不以終端機來區分。

接下來是sort命令,其中:r指代reverse,這裡是指反向比較結果,輸出時預設從小到大,反向後從大到小。n指代numberic sort,根據其數值排序。k代表根據哪一列進行排序,後面的數字3表示按照第3列排序。本例中,可以看到%cpu在第3個位置,因此k3表示根據%cpu的數值進行由大到小的排序。

接下來的「|」為管道符號,將查詢出的結果導到下面的命令中進行下一步的操作。

最後的「head -10」命令獲取預設前10行資料。

清除殭屍過程

乙個殭屍程序產生的過程是:父程序呼叫fork建立子程序後,子程序執行直至其終止,它立即從記憶體中移除,但程序描述符仍然保留在記憶體中。

要查詢系統中的殭屍程序,有多種方法,這裡給出一種命令列探測殭屍程序的方法:

[root@localhost ~]# ps -e -o stat,ppid,pid,cmd | egrep  '^[zz]'z

介紹下幾個引數:

-e:引數用於列出所有的程序

-o:引數用於設定輸出格式,這裡只輸出程序的stat(狀態資訊)、ppid(父程序pid)、pid(當前程序的pid),cmd(即程序的可執行檔案。

egrep:是linux下的正規表示式工具

'^[zz]':這是正規表示式,^表示第乙個字元的位置,[zz],表示小寫z或者大寫的z字母,即表示第乙個字元為z或者z開頭的程序資料,只所以這樣是因為殭屍程序的狀態資訊以z或者z字母開頭。

找到殭屍程序的pid後,直接通過」kill -9 pid「命令殺掉即可,但是如果殭屍程序很多的話,就會很繁瑣,因此,還需要乙個批量刪除殭屍程序的辦法:

[root@localhost ~]# ps -e -o stat,ppid,pid,cmd | grep -e '^[zz]' | awk '' | xargs kill -9

這是個命令組合,通過管道實現命令的組合應用。

「grep -e」相當於egrep命令。

「awk '' 」是將前面命令的輸出資訊進行過濾,僅僅輸出第二列的值,而第二列就是程序的ppid。

「xargs kill -9」這是將得到的ppid傳給「kill -9」作為引數,也就是kill掉這些ppid。xargs命令可以將標準輸入轉成各種格式化的引數,這裡是將管道的輸出內容作為引數傳遞給kill命令。

殺掉殭屍程序,這個是治標不治本的。真正的辦法是,不讓它產生。那麼如何避免殭屍程序的產生呢?

殺死linux的殭屍程序

linux並不把程序的樹形結構匯出給普通使用者,然而在核心中,它卻使用樹形結構來管理程序。linux核心使用 子程序退出,父程序收屍,父程序退出,子程序被過繼 這種方式來管理程序的死亡,然而卻少了一種,那就是父程序不給子程序收屍的情況,這就是殭屍程序的原因。既然知道了殭屍程序為何產生,那麼想乾掉它們...

Linux系統中殺死殭屍程序的方法

在linux系統管理中,當用ps命令觀察程序的執行狀態時,經常看到某些程序的狀態列為defunct,這就是所謂的 殭屍 程序。殭屍 程序是乙個早已 死亡的程序,但在程序表 processs table 中仍佔了乙個位置 slot 由於程序表的容量是有限的,所以,defunct程序不僅占用系統的記憶體...

Linux 檢視程序 殺死程序的命令

今天在使用 docker 啟動 mysql 的時候,發生了乙個 error 具體資訊如下 剛開始看到這個 error 使用 lsof i 3306 查詢占用3306埠的程序的 pid,然後使用 kill 命令將其殺死。然而 lsof i 3306 並不能查到這個 pid,plan a 失敗。後來又嘗...