ज़ोंबी प्रक्रिया कैसे खोजें?


100
System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
a@SERVER:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
a@SERVER:~$ 

उस ज़ोंबी प्रक्रिया को कैसे खोजें?


क्यों न आप सिस्टम मॉनिटर खोलें और ज़ोंबी प्रक्रिया की खोज करें?
8

8
कैसे करें कि एक बिना सिर के एक्स सर्वर पर?
सब्रेवुल्फी

2
हैरानी की बात है कि नीचे कोई जवाब वास्तव में नहीं कहता है कि उपरोक्त आउटपुट के आधार पर सिस्टम में कोई ज़ोंबी प्रक्रिया नहीं है। यदि वास्तव में एक था, तो ps auxwww | grep 'Z'कमांड को एक Zराज्य में एक प्रक्रिया दिखानी चाहिए थी । "सिस्टम की जानकारी" कहावत => There is 1 zombie process.एक बग लगती है। या तो, या प्रश्न में कोई गुम सूचना है।
अरीफ

जवाबों:


126

एक ज़ोंबी (प्रक्रिया) को मारने के लिए आपको इसकी मूल प्रक्रिया (बस असली लाश की तरह!) को मारना होगा, लेकिन सवाल यह था कि इसे कैसे पाया जाए।

ज़ोंबी का पता लगाएं (सवाल इस भाग का जवाब दिया):

a@SERVER:~$ ps aux | grep 'Z'

आपको जो कुछ मिलता है वह लाश है और उसके साथ जेड में कुछ भी है, इसलिए आपको ग्रीप भी मिलेगा:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

ज़ोंबी के जनक का पता लगाएं:

a@SERVER:~$ pstree -p -s 93572

तुम्हे दूंगा:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

इस मामले में आप उस मूल प्रक्रिया को नहीं मारना चाहते हैं और आपको एक ज़ोंबी से काफी खुश होना चाहिए, लेकिन तत्काल माता-पिता की प्रक्रिया को 5145 से मारना चाहिए।

Askubuntu पर अतिरिक्त संसाधन:


1
आप अपने उत्तर में जो परिणाम दिखाते हैं, वह grep कमांड ही है, ज़ोंबी प्रक्रिया नहीं। यह पाब्लो ने अपने जवाब में जैसा गलत बयान दिया है, वैसा ही है। नीचे रिन्ज़विंड द्वारा जवाब वास्तव में ज़ोंबी प्रक्रिया की तलाश करता है और उन्हें सूचीबद्ध करता है। एक अन्य विकल्प "
डिफेक्ट

pstree -H your_desired_pid -p
ग्रेग एम। क्रसक

चर्चा में जोड़ने के लिए धन्यवाद ग्रेग, लेकिन कृपया याद रखें कि यह एक सहायता साइट है, बस कुछ भी बताए बिना एक कमांड चिपकाना यहां आने वाले अधिकांश लोगों के लिए मददगार नहीं है।
डंकनमो

1
यह एक महान जवाब है! यह आज भी वैध है! मैं अपनी ज़ोंबी प्रक्रिया को खोजने में सक्षम था और बिना किसी समस्या के इसकी मूल प्रक्रिया को मार सकता था। धन्यवाद!
टेरेंस

1
अगर आपके पास pstree स्थापित नहीं है, ps wauxfतो वही काम करता है
JDS

35

हालांकि यह प्रश्न पुराना है, मुझे लगा कि हर कोई अधिक विश्वसनीय उत्तर पाने का हकदार है:

ps axo pid=,stat=

यह दो व्हाट्सएप-सीमांकित कॉलम का उत्सर्जन करेगा, जिनमें से पहला पीआईडी ​​है और दूसरा इसका राज्य है।

मुझे नहीं लगता कि GNU psसीधे राज्य द्वारा फ़िल्टर करने का एक तरीका प्रदान करता है, लेकिन आप मज़बूती से ऐसा कर सकते हैंawk

ps axo pid=,stat= | awk '$2~/^Z/ { print }'

अब आपके पास PIDs की एक सूची है जो कि लाश हैं। चूंकि आप जानते हैं कि राज्य अब इसे प्रदर्शित करने के लिए आवश्यक नहीं है, इसलिए इसे फ़िल्टर किया जा सकता है।

ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'

ज़ोंबी पीआईडी ​​की एक नईलाइन-सीमांकित सूची देना।

अब आप एक साधारण शेल लूप के साथ इस सूची पर काम कर सकते हैं

for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; do
    echo "$pid" # do something interesting here
done

ps एक शक्तिशाली उपकरण है और इसके बारे में जानकारी प्राप्त करने के लिए आपको कुछ भी जटिल करने की आवश्यकता नहीं है।

(विभिन्न प्रक्रियाओं का अर्थ यहां बताया गया है - https://unix.stackexchange.com/a/18477/121634 )


2
awkयह भी एक शक्तिशाली उपकरण है जो न केवल पाठ को विभाजित करता है, बल्कि इसका मिलान भी कर सकता है। +1 ... दूसरों ने grepइसका उपयोग किया जहां यह अनावश्यक और अभेद्य है।
0xC0000022L

इसलिए अब मेरे पास ज़ोंबी प्रक्रियाओं की सूची है। मैं उन्हें कैसे मारूं?
चॉवी

@chovy: यह निर्भर करेगा, लेकिन आमतौर पर माता-पिता को मारना या संकेत देना शामिल है। अन्य उत्तर यहां दिए गए हैं। ऊपर दिखाए गए लूप के भीतर से आप माता-पिता को इस तरह पा सकते हैं:ps -p "$pid" -opid=,ppid=
सोरपिगल

अगर मैं माता-पिता को अपने बच्चे की सभी प्रक्रियाओं को नहीं मारूंगा? मैं सिर्फ एक ज़ोंबी प्रक्रिया को मारना चाहता हूं। मैं ppid को जानता हूं।
चॉवी

1
मैं ppid=विकल्प सूची में जोड़ने का सुझाव देता हूं , इसलिए ppid प्राप्त करने के लिए एक अलग कमांड का उपयोग करने की आवश्यकता नहीं है।
डिंग-यी चेन

3

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

से: http://www.cyberciti.biz/tips/killing-zombie-process.html

टिप्पणियों से एक बेहतर एक:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print $2}'); do
        kill -9 $every;
    done;
done;

हालांकि सावधान: यह एक भी सेना को मारता है।


अभी भी कुछ भी नहीं है। मुझे लगता है कि मेरा तरीका भी गलत नहीं था।
पाब्लो

दूसरा उदाहरण नारकीय अविश्वसनीय है और पूर्व अनावश्यक रूप से क्रिया है ( ps axo pid=,stat= | awk '$2~/Z/ {print $1}'इसके बजाय प्रयास करें )।
सोरपिगल

3

हालांकि कम अधिक है:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

ऐसा ही है, मुझे किसी भी ट्टी पर असीमित चौड़ाई वाले उपयोगकर्ता उन्मुख प्रारूप में सभी उपयोगकर्ताओं की प्रक्रियाओं का एक जंगल (पेड़) दें और इसे ऊपर की आधी स्क्रीन पर मुझे दिखाएं जहां यह मामला से मेल खाता है कि 8 वें कॉलम में जेड है, और पूरी लाइन को हाइलाइट क्यों नहीं किया।

उपयोगकर्ता उन्मुख प्रारूप का मतलब लगता है: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMANDइसलिए 8 वीं कॉलम में ज़ोंबी स्थिति दिखाई देगी।

यदि आप लाइन नंबर चाहते हैं, और मैच में एक तारांकन चिह्न चाहते हैं , तो आप Nपहले फेंक सकते हैं । अफसोस की बात है कि यदि आप उस रेखा को उजागर नहीं करने के लिए उपयोग करते हैं जो तारांकन नहीं दिखाएगा, हालांकि इसके लिए जगह बनाता है।pJGJ

आप अंत में ऐसा कुछ प्राप्त करते हैं जो दिखता है:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: lamblin@pts/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

आप इसका अनुसरण कर सकते हैं (और यह पता लगा सकते हैं कि आपका टर्मिनल पसंद करता है-यू यूनिकोड या -ए असिसी):

pstree -psS <PID LIST>

या बस, आप जानते हैं, lessपदानुक्रम के माध्यम से उस पेड़ / जंगल का पालन करने के लिए ऊपर-तीर का उपयोग करें; जो कि मैं "कम अधिक है" दृष्टिकोण के साथ सिफारिश कर रहा था।


0

मैं आपको यह आदेश सुझाता हूं:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'

auxजब आप इसका उपयोग कर सकते हैं -oऔर अनुरोध कर सकते हैं, तो इसका उपयोग करना और उससे बाहर निकलने वाले तारों को बेकार करना अविश्वसनीय रूप से अविश्वसनीय है । ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'इसके बजाय उपयोग करें ।
सोरपीगल

-1

प्रक्रिया लाश को सूचीबद्ध करने के लिए, इस कमांड को आज़माएँ:

ps j | awk '$7 ~ "Z"'

आपको $7अपने ऑपरेटिंग सिस्टम के आधार पर बदलने की आवश्यकता हो सकती है।

यह उनकी मूल प्रक्रिया आईडी ( PPID) की सूची भी लौटाएगा ।

लाश को मारने की कोशिश करने के लिए (उपरोक्त आदेश का परीक्षण करने के बाद), कोशिश करें:

kill -9 $(ps j | awk 'NR>1 && $7 ~ "Z" {print $2}')

अपने माता-पिता की पहचान करने के लिए pstree, जैसे:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)

इसके लिए jप्रारूप में से एक कॉलम को अलग करने की आवश्यकता अनावश्यक रूप से जटिल है। इसका -oचयन करने के लिए उपयोग करें कि आप इसके बजाय क्या चाहते हैं।
सोरपिगल

2
ps jसिस्टम में सभी प्रक्रियाओं को प्रिंट नहीं करता है। यह केवल वर्तमान उपयोगकर्ता procs (BSD जॉब्स शैली में) को सूचीबद्ध करता है ताकि यह ज़ोंबी प्रक्रियाओं को याद कर सके।
अरीफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.