在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殺不死,但是我們可以殺死殭屍程序的父程序。父程序死後,殭屍程序成為」孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。
一步步講解
首先ps -eo ppid,stat
-e檢視所有程序,-o可以檢視使用者自定義的狀態,例如-o ppid檢視所有程序的ppid,可選項pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
這裡我們選取ppid父程序的id和stat狀態
然後ps -eo ppid,stat|grep z從所有程序中的stat狀態中選擇狀態為z也就是zombie的程序
接著ps -eo ppid,stat|grep z|cut 1-5因為我們只要殭屍程序的父程序id,所以使用cut來選取父程序id
最後ps -eo ppid,stat|grep z|cut 1-5|xargs kill -9將前面選取的父程序id作為引數傳送給kill -9去執行。
到此我們殺死了所有殭屍程序的父程序,殭屍程序一般也都已經殺死了。
Linux 如何清理殭屍程序
今天在維護伺服器的時候,發現有5個nova novncproxy的殭屍程序。定義 in unix system terminology,a process that has terminated,but whose parent has not yet waited for it,is called...
自動清理殭屍程序及STOP程序指令碼
bin bash echo 殭屍程序 check ps a o stat,ppid,pid,cmd grep e zz if n check then echo 發現殭屍程序 for pid in ps a o stat,ppid,pid,cmd grep e zz awk do kill 9 pi...
Linux 殭屍程序
怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...