天天看點

linux如何查程序、殺程序

linux如何查程序、殺程序

1.查程序

    ps指令查找與程序相關的PID号:

    ps a 顯示現行終端機下的所有程式,包括其他使用者的程式。 

    ps -A 顯示所有程式。 

    ps c 列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,參數或常駐服務的标示。 

    ps -e 此參數的效果和指定"A"參數相同。 

    ps e 列出程式時,顯示每個程式所使用的環境變量。 

    ps f 用ASCII字元顯示樹狀結構,表達程式間的互相關系。 

    ps -H 顯示樹狀結構,表示程式間的互相關系。 

    ps -N 顯示所有的程式,除了執行ps指令終端機下的程式之外。 

    ps s 采用程式信号的格式顯示程式狀況。 

    ps S 列出程式時,包括已中斷的子程式資料。 

    ps -t<終端機編号> 指定終端機編号,并列出屬于該終端機的程式的狀況。 

    ps u 以使用者為主的格式來顯示程式狀況。 

    ps x 顯示所有程式,不以終端機來區分。

    最常用的方法是ps aux,然後再通過管道使用grep指令過濾查找特定的程序,然後再對特定的程序進行操作。

    ps aux | grep program_filter_word,ps -ef |grep tomcat

2.殺程序

   使用kill指令結束程序:kill xxx

   常用:kill -9 324

   Linux下還提供了一個killall指令,可以直接使用程序的名字而不是程序辨別号,例如:# killall -9 NAME

1. ps 簡介

ps 指令就是最根本相應情況下也是相當強大地程序檢視指令.運用該指令可以确定有哪些程序正在運作和運作地狀态、 程序 是否結束、程序有沒有僵死、哪些程序占用了過多地資源等等.總之大部分資訊均為可以通過執行該指令得到地.

2. ps 指令及其參數

ps 指令最經常使用地還是用于監控背景程序地工作情況,因為背景程序是不和螢幕鍵盤這些标準輸入/輸出設

備進行通信地,是以如果需要檢測其情況,便可以運用 ps 指令了.

該指令文法格式如下:

ps [選項]

-e 顯示所有程序,環境變量

-f 全格式

-h 不顯示标題

-l 長格式

-w 寬輸出

a

顯示終端上地所有程序,包括其他使用者地程序

r

隻顯示正在運作地程序

x

顯示沒有控制終端地程序

O[+|-] k1 [,[+|-] k2 [,…]] 根據 SHORT KEYS、k1、k2 中快捷鍵指定地多級排序順序顯示程序清單.

對于 ps 地不同格式都存在着預設地順序指定.這些預設順序可以被使用者地指定所覆寫.在這裡面“+”字元是可選地,“-” 字元是倒轉指定鍵地方向.

pids 隻列出程序辨別符,之間運用逗号分隔.該程序清單必須在指令行參數地最後一個選項後面緊接着給出,中間不能插入 空格.比如:ps -f1,4,5.

以下介紹長指令行選項,這些選項都運用“--”開頭:

--sort X[+|-] key [,[+|-] key [,…]] 從 SORT KEYS 段中選一個多字母鍵.“+”字元是可選地,因為預設地方向就是按 數字升序或者詞典順序.比如: ps -jax -sort=uid,-ppid,+pid.

--help 顯示幫助資訊.

--version 顯示該指令地版本資訊.

在前面地選項說明中提到了排序鍵,接下來對排序鍵作進一步說明.需要注意地是排序中運用地值是 ps 運用地内部值,并非 僅用于某些輸出格式地僞值.排序鍵清單見表 4-3.

表 4-3 排序鍵清單

c

cmd

可執行地簡單名稱

C

cmdline

完整指令行

f

flags

長模式标志

g

pgrp

程序地組 ID

G

tpgid

控制 tty 程序組 ID

j

cutime

累計使用者時間

J

cstime

累計系統時間

k

utime

使用者時間

K

stime

系統時間

m

min_flt

次要頁錯

可以直接使用top指令後,檢視%MEM的内容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的指令:

 (1)top

  top指令是Linux下常用的性能分析工具,能夠實時顯示系統中各個程序的資源占用狀況,類似于Windows的任務管理器

  可以直接使用top指令後,檢視%MEM的内容。可以選擇按程序檢視或者按使用者檢視,如想檢視oracle使用者的程序記憶體使用情況的話可以使用如下的指令:

  $ top -u oracle

内容解釋:

  PID:程序的ID

  USER:程序所有者

  PR:程序的優先級别,越小越優先被執行

  NInice:值

  VIRT:程序占用的虛拟記憶體

  RES:程序占用的實體記憶體

  SHR:程序使用的共享記憶體

  S:程序的狀态。S表示休眠,R表示正在運作,Z表示僵死狀态,N表示該程序優先值為負數

  %CPU:程序占用CPU的使用率

  %MEM:程序使用的實體記憶體和總記憶體的百分比

  TIME+:該程序啟動後占用的總的CPU時間,即占用CPU使用時間的累加值。

  COMMAND:程序啟動指令名稱

  常用的指令:

  P:按%CPU使用率排行

  T:按MITE+排行

  M:按%MEM排行

(2)pmap

  可以根據程序檢視程序相關資訊占用的記憶體情況,(程序号可以通過ps檢視)如下所示:

  $ pmap -d 14596

 (3)ps

  如下例所示:

  $ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'  其中rsz是是實際記憶體

  $ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle |  sort -nrk5

  其中rsz為實際記憶體,上例實作按記憶體排序,由大到小

linux 如何清理僵屍程序

今天在維護伺服器的時候,發現有5個nova-novncproxy的僵屍程序。

26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf

4765 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

4766 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

4767 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

4768 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

4769 ?        Z      0:00      \_ [nova-novncproxy] <defunct>

之前對于僵屍程序的了解并不深,趕緊找了篇相關文章來學習一下,該如何處理。

定義

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie.

     在UNIX 系統中,一個程序結束了,但是他的父程序沒有等待(調用wait / waitpid)他, 那麼他将變成一個僵屍程序.  在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝SIGCHLD信号處理函數調用 waitpid()等待子程序結束,又沒有顯式忽略該信号,則子程序成為僵屍程序。

如何檢視linux系統上的僵屍程序,如何統計有多少僵屍程序?

#ps -ef | grep defunct

或者查找狀态為Z的程序,Z就是代表zombie process,僵屍程序的意思。

另外使用top指令檢視時有一欄為S,如果狀态為Z說明它就是僵屍程序。

Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie

top指令中也統計了僵屍程序。或者使用下面的指令:

ps -ef | grep defunct | grep -v grep | wc -l

如何殺死僵屍程序呢?

一般僵屍程序很難直接kill掉,不過您可以kill僵屍爸爸。父程序死後,僵屍程序成為”孤兒程序”,過繼給1号程序init,init始終會負責清理僵屍程序.它産生的所有僵屍程序也跟着消失。

ps -e -o ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9

kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`

當然您可以自己編寫更好的shell腳本,歡迎與大家分享。

我将nova-novncproxy stop後再start,僵屍程序即消失,問題解決。

另外子程序死後,會發送SIGCHLD信号給父程序,父程序收到此信号後,執行waitpid()函數為子程序收屍。就是基于這樣的原理:就算父程序沒有調用wait,核心也會向它發送SIGCHLD消息,而此時,盡管對它的預設處理是忽略,如果想響應這個消息,可以設定一個處理函數。

如何避免僵屍程序呢?

處理SIGCHLD信号并不是必須的。但對于某些程序,特别是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序将成為僵屍程序(zombie)進而占用系統資源。如果父程序等待子程序結束,将增加父程序的負擔,影響伺服器程序的并發性能。在Linux下 可以簡單地将 SIGCHLD信号的操作設為SIG_IGN。

signal(SIGCHLD,SIG_IGN);

這樣,核心在子程序結束時不會産生僵屍程序。這一點與BSD4不同,BSD4下必須顯式等待子程序結束才能釋放僵屍程序

或者

用兩次fork(),而且使緊跟的子程序直接退出,是的孫子程序成為孤兒程序,進而init程序将負責清除這個孤兒程序。

Linux檢視端口使用狀态、關閉端口方法

分類: 電腦基礎知識2012-04-18 13:11 51938人閱讀 評論(0) 收藏 舉報

繼續閱讀