2009-02-22 3 views
14

Wikipedia के अनुसार, को forkbomb :(){ :|:& };: zsh आदेश while (sleep 100 &!) do; done साथ रोका जा सकता है, जो होगा माना जाता है कि अंडे नींद 100 प्रक्रियाओं तक । सभी को forkbomb प्रक्रिया चले गए हैं यह जादू की तरह लगता है;?। यह कैसे काम करता रहा विशेष रूप से उत्सुक के रूप में करने के लिए वास्तव में क्या "! &" का अर्थ हूँकैसे करता है "जबकि (नींद 100 &!) do; किया" zsh में काम करते हैं, और यह कैसे बैश में दोहराया जा सकता है?

क्या होगा बैश में की तरह एक बराबर आदेश नज़र

उत्तर

11

कारण यह है कि एक कांटा-बम काम करता है क्योंकि किसी भी समय चलने वाली प्रक्रियाओं की संख्या के लिए सीमित सीमा होती है, और एक फोर्क-बम इस सीमा को भरने के लिए डिज़ाइन किया गया है।

क्योंकि आपके द्वारा प्रदत्त फोर्कबॉम्ब कोड मर जाता है अगर यह किसी बच्चे की प्रक्रिया को जन्म नहीं दे सकता है, तो मूल प्रक्रियाएं वास्तव में आसपास नहीं रहती हैं, लेकिन तथ्य यह है कि बच्चे नए ग्रैंड * -इल्डरेन बनाते हैं, प्रक्रिया तालिका पूरी होती है।

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

एक बार प्रक्रिया तालिका पूरी नींद प्रक्रियाओं से भरी हुई है, जबकि लूप को मार दिया जा सकता है, और नींद की प्रक्रिया खत्म होने के बाद नींद की प्रक्रिया मर जाएगी। समस्या हल की गई

जैसा कि पहले ही zsh आदेश का महत्वपूर्ण हिस्सा उल्लेख किया गया है है रन-इन-पृष्ठभूमि &, तो बैश आदेश मूलतः एक ही अन्य उत्तर में दी गई होगी:

while (sleep 100 &) do; done 

मैं डॉन ऐसा नहीं लगता कि nohup/! हिस्सा तब तक महत्वपूर्ण है जब तक आप नींद के समय में लॉग आउट नहीं करना चाहते हैं, लेकिन अगर मैं गलत हूं तो मुझे सीधे सेट करने में खुशी होगी।

2

? बहुत दिलचस्प सवाल!

उस विकिपीडिया लेख के अनुसार, पूर्ण आदेश का उद्देश्य कई हानिरहित नौकरियों को बनाना है जो कांटा बम को अक्षम कर देंगे क्योंकि यह अब और भी बच्चों को जन्म देने में सक्षम नहीं होगा।

zsh manual के अनुसार,

एक नौकरी &|' or & के साथ शुरू किया गया है, तो! ', तो उस काम तुरंत त्याग है। स्टार्टअप के बाद, इसमें जॉब टेबल में स्थान नहीं है, और यह नहीं है, जो यहां वर्णित नौकरी नियंत्रण सुविधाओं के अधीन है।

मुझे यकीन नहीं है कि बैश के साथ इसे कैसे प्राप्त किया जाए। हालांकि, निम्नलिखित की तरह कुछ कर सकता:

nohup sleep 100 & 
8

पहले कांटा बम लिखा जा सकता है:

foo() 
{ 
    foo|foo& 
} 
foo 

कौन सा यह थोड़ा स्पष्ट करता है - प्रत्येक यात्रा दो subprocesses शुरू होता है, तो मर जाता है। तो अगर फोर्किंग विफल हो जाती है, तो यह चारों ओर लटका नहीं होगा।

इसलिए हमें केवल अस्थायी रूप से विफल होने के लिए करना है। इस प्रकार हम प्रक्रियाओं को बनाते हैं जो 100 सोते हैं और प्रक्रिया की जगह पर कब्जा करते हैं, क्योंकि नींद की प्रक्रिया होती है।

zsh &!& जैसा है लेकिन नई प्रक्रिया को अस्वीकार करता है (लॉगऑफ पर इसे मारता नहीं है) - यह संभवतः इस उदाहरण में महत्वपूर्ण नहीं है। (manual) इसे nohup के साथ बदला जा सकता है।

इसलिए बैश:

while (nohup sleep 100 &) do; done 

काम करना चाहिए।

6

मैं वह व्यक्ति हूं जिसने विकिपीडिया लेख के उस हिस्से को लिखा है (और जिसने मेरे सिस्टम पर गलती से कांटा बम शुरू करने के बाद इस इलाज को "खोजा"!)।

"" का कारण! "&" के बजाय "जेएसएच को नई प्रक्रिया पर नौकरी नियंत्रण करने से रोकने के लिए है, यानी, यह कब और कब समाप्त होने पर देखभाल करने की कोशिश कर रहा है। मुझे याद नहीं है कि जब मैंने कोशिश की तो नौकरी नियंत्रण एक समस्या क्यों थी, लेकिन यह था। आप वास्तव में यह देखने के लिए कोशिश कर सकते हैं कि "इलाज" कैसे काम करता है और यदि आप नौकरी नियंत्रण को रोक नहीं पाते हैं तो क्या होता है। हो सकता है कि जॉब कंट्रोल के साथ समस्या को ज़ेड में कुछ बग के साथ करना पड़े जो कि बैश में भी मौजूद नहीं है, और शायद यह अब zsh में प्रासंगिक नहीं है।

तो बैश के साथ केवल "" आज़माएं, और यदि नौकरी नियंत्रण हस्तक्षेप कर रहा है, तो इसे अक्षम करने का प्रयास करें ("सेट + एम") और उम्मीद है कि यह काम करेगा।

आप सही हैं कि विकिपीडिया लेख शायद zsh निर्भर नहीं होना चाहिए।

संबंधित मुद्दे