जब खुद से कांटा () और निष्पादन () कॉल करने के लिए?


9

मैं fork () और exec () कमांड्स के बारे में सीख रहा हूं। ऐसा लगता है कि कांटा () और निष्पादन () आमतौर पर एक साथ कहा जाता है। (कांटा () एक नई चाइल्ड प्रोसेस बनाता है, और एग्ज़िक्यूशन) मौजूदा प्रोसेस इमेज को एक नए के साथ बदल देता है।) हालाँकि, आप प्रत्येक फ़ंक्शन को किन परिदृश्यों में कॉल कर सकते हैं? क्या इस तरह के परिदृश्य हैं?


2
पारंपरिक forkbomb: जबकि (1) कांटा (); सिस्टम संसाधनों को हॉग करने के लिए।
जोशुआ

जवाबों:


22

ज़रूर! "रैपर" कार्यक्रमों में एक सामान्य पैटर्न विभिन्न चीजों को करना है और फिर केवल एक execकॉल (कोई कांटा) के साथ कुछ अन्य कार्यक्रम के साथ खुद को बदलना है

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

इसका एक वास्तविक जीवन उदाहरण है GIT_SSH(हालांकि git(1)यह भी पेशकश करता है GIT_SSH_COMMANDकि आप उपरोक्त आवरण कार्यक्रम विधि नहीं करना चाहते हैं)।

कांटा-केवल का उपयोग तब किया जाता है जब आम तौर पर कार्यकर्ता प्रक्रियाओं का एक गुच्छा पैदा होता है (उदाहरण के लिए httpdकांटा मोड में अपाचे) (हालांकि कांटा-केवल बेहतर सूट प्रक्रियाएं जो सीपीयू को जलाने की आवश्यकता होती हैं और न कि उन अंगूठे जो नेटवर्क I / O होने की प्रतीक्षा कर रहे हैं) ) या OpenBSD पर और अन्य कार्यक्रमों द्वारा उपयोग किए गए विशेषाधिकार अलगाव के लिए sshd(कोई निष्पादन नहीं)

$ doas pkg_add pstree
...
$ pstree | grep sshd
 |-+= 70995 root /usr/sbin/sshd
 | \-+= 28571 root sshd: jhqdoe [priv] (sshd)
 |   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

rootSshd क्लाइंट पर स्वयं की प्रतिलिपि (28,571) और फिर विशेषाधिकार अलग होने के लिए एक और कॉपी (14625) बंद काँटेदार कनेक्ट किया गया है।


14

वहां बहुत सारे हैं।

प्रोग्राम जो fork()बिना बुलाए exec()आम तौर पर विभिन्न प्रक्रियाओं में मुख्य कार्य के लिए विभिन्न कार्यों को करने के लिए स्पॉइंग चाइल्ड वर्कर प्रक्रियाओं के एक पैटर्न का अनुसरण कर रहे हैं । के रूप में के रूप में विविध कार्यक्रमों में आप इस मिल जाएगा dhclient, php-fpmऔर urxvtd

एक प्रोग्राम जो exec()बिना कॉल करता fork()है, चेन लोडिंग है , एक अलग प्रोग्राम इमेज के साथ इसकी प्रक्रिया को ओवरलेइंग करता है। श्रृंखला लोड करने की उपयोगिताओं की एक पूरी उपसंस्कृति है जो राज्य को संसाधित करने के लिए विशेष चीजें करते हैं और फिर उस संशोधित प्रक्रिया राज्य के साथ चलने के लिए किसी अन्य प्रोग्राम को निष्पादित करते हैं। सेवा और सिस्टम प्रबंधन टूलसेट के डेमोनटूल परिवार में ऐसी उपयोगिताओं आम हैं , लेकिन उन तक सीमित नहीं हैं। कुछ उदाहरण:

डेमोंटोल्स परिवार के टूलसेट में बहुत सारे ऐसे उपकरण हैं, जिनके machineenvमाध्यम find-matching-jvmसे runtool


2

अन्य उत्तरों के अलावा, डिबगर, का उपयोग करते हुए ptrace, आम तौर पर forkऔर के बीच के अंतर का उपयोग करते हैं exec। एक डिबग्यू को खुद को PTRACE_TRACEMEयह इंगित करने के लिए चिह्नित करना चाहिए कि यह इसकी मूल प्रक्रिया - डीबगर द्वारा पता लगाया जा रहा है। यह डीबगर को आवश्यक अनुमति देना है।

तो एक डीबगर पहले खुद को कांटा होगा। बच्चे कहेंगे ptraceसाथ PTRACE_TRACEMEऔर फिर फोन exec। जो भी कार्यक्रम बच्चे के निष्पादन को अब माता-पिता द्वारा पता लगाने योग्य होगा।


कांटा और निष्पादन के बीच चीजों को करने के कई उदाहरण हैं, सबसे आम I / O को पुनर्निर्देशित किया जा रहा है (जैसे पाइप स्थापित करना)। लेकिन सवाल किसी भी निष्पादन के बिना कांटा करने के बारे में है।
Barmar

0

कांटा के बिना निष्पादित

कम से कम दो कारण हैं कि आप ऐसा क्यों करना चाहेंगे:

  1. चेन लोडिंग। वर्तमान प्रक्रिया छवि को कुछ अलग से बदल दिया जाता है।
  2. वर्तमान में चल रहे प्रोग्राम को पुनरारंभ करना (उदाहरण के लिए तब हो सकता है जब आप SIGHUP या इस तरह की सर्वर प्रक्रिया, सब कुछ फिर से लोड करना और पूरी तरह से नई शुरुआत करना)। किसी तरह, कोई यह तर्क दे सकता है कि श्रृंखला लोड हो रही है, केवल संयोग से उसी कार्यक्रम के साथ।

बिना निष्कासन के कांटा

यही कारण है कि हर डेमन हर बार शुरू होने पर (दो बार, वास्तव में) करता है। यह कई चीजें करता है, उनमें से शेल लटका नहीं है (मूल प्रक्रिया के बाद से शेल समाप्त हो जाता है) और डेमॉन को टर्मिनल द्वारा नियंत्रित नहीं किया जाता है, इसलिए शेल विंडो को बंद करना डेमॉन को नहीं मारता है।

एक और आम उपयोग श्रमिक बच्चों के लिए है, जो लगभग 25 साल पहले एपाचे वेब सर्वर द्वारा प्रसिद्ध किया गया था (आजकल यह गरजना झुंड की समस्या से ग्रस्त होने के कारण कला की स्थिति नहीं माना जाता है, लेकिन यह सुनिश्चित करता है darn सबसे सरल, सबसे मजबूत सर्वर संभव)।

फिर भी एक और आम उपयोग एक सुसंगत स्नैपशॉट बनाना है। forkन केवल एक प्रक्रिया बनाता है, यह भी कॉपी करता है (सिद्धांत रूप में, वास्तव में यह केवल पृष्ठों को कॉपी-ऑन-राइट लिखता है) पता स्थान। यह (atomically) संपूर्ण प्रोग्राम डेटा का एक स्नैपशॉट बनाता है जिसे माता-पिता अब संशोधित नहीं कर सकते।
कुछ कार्यक्रम इसका लाभ उठाते हैं। उदाहरण के लिए, रेडिस डेटा को डिस्क (एक सुसंगत स्थिति में) में सहेजता है जबकि एक ही समय में डेटा सेट को समवर्ती रूप से संशोधित करता है। यह केवल इसलिए काम करता है क्योंकि forkएक सुसंगत स्नैपशॉट बनाया गया है जो मूल प्रक्रिया द्वारा किए गए संशोधनों को नहीं देखता है।


यह वास्तव में आजकल बहुत कम है, ज्यादातर इसे मानक के रूप में नहीं करने के लिए या आमतौर पर इस्तेमाल नहीं किए जाने वाले मोड के साथ। यह तत्परता मिसमैच और भयावहता के लिए अग्रणी एक कांटा है , और डूमोनेस गिरावट की गलतियों में से एक है । यह गलती लंबे समय से चली आ रही है।
जेडीबीपी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.