झाड़ में लाश


11

बैश लाश बनाने के लिए प्रतीत नहीं होता है। ऐसा लगता है कि जब वे मारे जाते हैं तो प्रक्रियाएं तुरंत समाप्त हो जाती हैं।

क्या मैं बैश लाश बना सकता हूं?


मैं क्यों पूछ रहा हूँ:

मैं एक बच्चे की प्रक्रिया को सुरक्षित रूप से मारने में सक्षम होना चाहता हूं या kill -9अगर यह निश्चित अवधि के भीतर नहीं मरता है, लेकिन मैं गलती से एक प्रक्रिया को रोकना नहीं चाहता हूं जो कि मेरी बाल प्रक्रिया नहीं है। ज़ोंबी प्रक्रियाएं आमतौर पर इसे बहुत आसान और नस्ल-स्थिति को सुरक्षित बनाती हैं।


1
शायद एक और विचार ... अगर आप वास्तव में बाहरी प्रक्रियाओं को मारने से बचाना चाहते हैं, तो cgroups की जाँच करें। unshareएक पीआईडी ​​नाम स्थान बनाने के लिए कॉल करें, ताकि उस प्रक्रिया के पेड़ के भीतर से, बाहर की प्रक्रिया अलग और दुर्गम हो।
ओरियन

नौकरी नियंत्रण का उपयोग करें (जैसा कि, kill -KILL %nजहां nनौकरी की संख्या, और इसी तरह), इसे दरकिनार करने के बजाय।
नाममात्र पशु

बड़ा अच्छा सवाल! "आप क्यों पूछ रहे हैं" के लिए एक वैकल्पिक दृष्टिकोण, हालांकि: क्या आपने timeoutकमांड पर विचार किया है ?
वाइल्डकार्ड

जवाबों:


13

एक ज़ोंबी प्रक्रिया बनाने के लिए:

$ (sleep 1 & exec /bin/sleep 10)

यह उस शेल को प्रतिस्थापित करता है जिसके sleep 1साथ चलने /bin/sleep 10वाली sleep 1प्रक्रिया समाप्त नहीं होगी , इसलिए 10 सेकंड के लिए एक ज़ोंबी बनाना।


मुझे यकीन नहीं है कि आप एक ज़ोंबी प्रक्रिया को मारने से क्या उम्मीद करते हैं। एक ज़ोंबी प्रक्रिया पहले से ही मृत थी, आप इसे नहीं मार सकते।

दरअसल, आप ज़ोंबी प्रक्रियाओं को गायब कर सकते हैं, लेकिन इसके माता-पिता को मारकर, खुद ज़ोंबी प्रक्रियाओं को नहीं।


कटे हुए पीआईडी ​​रिसाइकल हो जाते हैं। लाश की बात यह है कि वे PID को तब तक सुरक्षित रखते हैं जब तक कि अभिभावक उस पर प्रतीक्षा करके अपने बच्चे की मृत्यु को स्वीकार नहीं कर लेते। इसके बिना, एक पिड को मारने से एक आकस्मिक शिकार हो सकता है।
पीएसकॉनिक

1
C में, आप यह सुनिश्चित कर सकते हैं कि जब आप अपने बच्चे को मारेंगे, तब तक आप एक दुर्घटना का शिकार नहीं होंगे, क्योंकि जब तक आप उस बच्चे का इंतजार नहीं करेंगे, तब तक उस बच्चे के PID को पुनर्नवीनीकरण नहीं किया जा सकता है। मैं शेल में समान गारंटी देने में सक्षम होना चाहता हूं।
PSkocik

3

इतना दिलचस्प जवाब नहीं:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

यह एक ज़ोंबी प्रक्रिया कैसे है? बस रुक गई। इसके अलावा $BASHPIDहै $$मुझे लगता है।
गाबोर सेसार्डी

$BASHPID वही नहीं है $$। निम्नलिखित कोड का प्रयास करें echo $$ $BASHPID ;echo $(echo $$ $BASHPID):। आप अधिक जानकारी पा सकते हैं man bash
एलेक्स बारानोव्स्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.