2009-02-05 16 views
34

मैंने this page पर ठोकर खाई और यह समझ में नहीं आता कि यह कैसे काम करता है।बैश कमांड:() {: |: & };: कर्नेल की मौत के लिए प्रक्रियाओं को जन्म देगा। क्या आप वाक्यविन्यास समझा सकते हैं?

यह आदेश "आपके बॉक्स लॉक होने तक उप-प्रोसेसिस को तेजी से बढ़ा देता है"।

लेकिन क्यों? जो मैं कम करता हूं वह कोलन हैं।

[email protected]$ :(){ :|:& };:

+0

मुझे यकीन है कि यह एक सटीक डुप्लिकेट है, लेकिन मुझे अभी मूल प्रश्न नहीं मिल रहा है। – SpoonMeiser

+0

@SpoonMeiser शायद यह है ?: http://askubuntu.com/questions/159491/why-did-the-command-make-my-system-lag-so-badly-i-had-to-reboot – tox123

उत्तर

61

एक समारोह : कहा जाता है जो अपने आप में दो बार कॉल को परिभाषित करता है कि (कोड: : | :)। यह पृष्ठभूमि में करता है (&)। ; के बाद फ़ंक्शन परिभाषा पूरी की जाती है और फ़ंक्शन : प्रारंभ हो जाता है।

तो के प्रत्येक उदाहरण: प्रक्रियाओं की एक द्विआधारी पेड़ की तरह और इतने पर ... ...

सादा सी में लिखा है:: दो नए शुरू होता है

while(1) { 
    fork(); 
} 
+3

सी समकक्ष बिल्कुल वैसा ही नहीं है (क्योंकि प्रत्येक प्रक्रिया सैद्धांतिक रूप से अनंत मात्रा में उत्पन्न होगी, जबकि प्रत्येक बैश-फोर्कबॉम्ब प्रक्रिया "केवल" दो प्रक्रियाओं को जन्म देगी), हालांकि दोनों का एक ही परिणाम है .. – dbr

+1

dbr, हाँ यह सही है। हालांकि मैं लिखने के समय उस बारे में, लेकिन सी कोड क्लीनर और सरल है। बैश एक बाइनरी पेड़ की तरह है, सी एक एन-आरी पेड़ की तरह है। –

+0

निकट सी संस्करण: 'जबकि (कांटा() == 0 || कांटा() == 0);' –

76
:(){ :|:& };: 

: नामक एक फ़ंक्शन को परिभाषित करता है, जो स्वयं को (दो बार, एक पाइप दूसरे में), और पृष्ठभूमि स्वयं बनाता है।

लाइन के साथ टूट जाता है:

:() 
{ 
    :|:& 
}; 
: 

का नाम बदल रहा : समारोह forkbomb रहे हैं:

forkbomb() 
{ 
    forkbomb | forkbomb & 
}; 
forkbomb 

आप ulimit का उपयोग कर प्रक्रियाओं-प्रति-उपयोगकर्ता की संख्या को सीमित करने के लिए द्वारा इस तरह के हमलों को रोकने के कर सकते हैं:

$ ulimit -u 50 
$ :(){ :|:& };: 
-bash: fork: Resource temporarily unavailable 
$ 

अधिक स्थायी रूप से, आप (उदाहरण के लिए डेबियन और दूसरों पर, कम से कम) /etc/security/limits.conf उपयोग कर सकते हैं,:

* hard nproc 50 

पाठ्यक्रम मतलब है कि आप केवल 50 प्रक्रियाओं चला सकते हैं, आप यह क्या कर रहा है मशीन के आधार पर बढ़ाने के लिए चाहते हो सकता है!

+10

उपरोक्त - देने का एक स्पष्ट नाम यह है कि मैं कोड को कैसे अनवरोधित कर दूंगा। – slim

+0

क्यों पाइप '|'?गोल्फिंग ('&&' का उपयोग किया जा सकता है?) या कोई फ़ंक्शन है? –

+2

@CiroSantilli: '&&' अनुक्रमिक रूप से आदेश चलाता है। '|' एक साथ दोनों को चलाता है, मानक फ़ाइल हैंडल को पाइप पर रीडायरेक्ट किया जाता है। –

1

इसका प्रयास करते समय मेरे पास अलग-अलग प्रभाव पड़ा। प्रक्रियाओं की संख्या और सीपीयू पावर के लिए कॉन्फ़िगर की गई ऊपरी सीमा पर निर्भर करता है (मुझे विश्वास है), यह पूरी तरह से दूसरों को ठंडा करते समय कुछ सिस्टमों पर मुश्किल से टक्कर लगी है।