ऑनवर्क्स लिनक्स और विंडोज ऑनलाइन वर्कस्टेशन

प्रतीक चिन्ह

वर्कस्टेशन के लिए मुफ्त होस्टिंग ऑनलाइन

<पिछला | विषय-सूची | अगला>

जाल

अध्याय 10 में, हमने देखा कि प्रोग्राम सिग्नलों पर कैसे प्रतिक्रिया दे सकते हैं। हम इस क्षमता को अपनी स्क्रिप्ट में भी जोड़ सकते हैं। हालाँकि अब तक हमने जो स्क्रिप्ट लिखी हैं, उनमें इस क्षमता की आवश्यकता नहीं है (क्योंकि उनके पास निष्पादन समय बहुत कम है, और अस्थायी फ़ाइलें नहीं बनाते हैं), बड़ी और अधिक जटिल स्क्रिप्ट को सिग्नल हैंडलिंग रूटीन होने से लाभ हो सकता है।

जब हम एक बड़ी, जटिल स्क्रिप्ट डिज़ाइन करते हैं, तो यह विचार करना महत्वपूर्ण है कि यदि स्क्रिप्ट चलने के दौरान उपयोगकर्ता कंप्यूटर को लॉग ऑफ या बंद कर देता है तो क्या होगा। जब ऐसी कोई घटना घटती है, तो सभी प्रभावित प्रक्रियाओं को एक संकेत भेजा जाएगा। बदले में, उन प्रक्रियाओं का प्रतिनिधित्व करने वाले प्रोग्राम प्रोग्राम की उचित और व्यवस्थित समाप्ति सुनिश्चित करने के लिए कार्रवाई कर सकते हैं। उदाहरण के लिए, मान लें कि हमने एक स्क्रिप्ट लिखी है जिसके निष्पादन के दौरान एक अस्थायी फ़ाइल बनाई गई है। अच्छे डिज़ाइन के क्रम में, जब स्क्रिप्ट अपना काम पूरा कर लेती है तो हम स्क्रिप्ट से फ़ाइल को हटा देते हैं। यदि कोई संकेत प्राप्त होता है कि प्रोग्राम समय से पहले समाप्त होने वाला है तो स्क्रिप्ट से फ़ाइल को हटाना भी स्मार्ट होगा।

खूब जोर से पीटना इस उद्देश्य के लिए एक तंत्र प्रदान करता है जिसे a के नाम से जाना जाता है जाल. ट्रैप को उचित रूप से नामित बिल्टिन कमांड के साथ कार्यान्वित किया जाता है, जाल. जाल निम्नलिखित सिंटैक्स का उपयोग करता है:

जाल तर्क संकेत [संकेत...]

जहां तर्क एक स्ट्रिंग है जिसे पढ़ा जाएगा और एक कमांड के रूप में माना जाएगा संकेत एक सिग्नल का विनिर्देश है जो व्याख्या किए गए कमांड के निष्पादन को ट्रिगर करेगा।

ये रहा एक सरल उदाहरण:



#! / Bin / bash


# ट्रैप-डेमो: सरल सिग्नल हैंडलिंग डेमो

#! / Bin / bash


# ट्रैप-डेमो: सरल सिग्नल हैंडलिंग डेमो


जाल "प्रतिध्वनि 'मैं तुम्हें अनदेखा कर रहा हूं।'" {1..5} में i के लिए SIGINT SIGTERM; करना

प्रतिध्वनि "पुनरावृत्ति $i का 5" नींद 5

किया

जाल "प्रतिध्वनि 'मैं तुम्हें अनदेखा कर रहा हूं।'" {1..5} में i के लिए SIGINT SIGTERM; करना

प्रतिध्वनि "पुनरावृत्ति $i का 5" नींद 5

किया


यह स्क्रिप्ट एक जाल को परिभाषित करती है जो निष्पादित करेगा गूंज स्क्रिप्ट चलने के दौरान हर बार SIG-INT या SIGTERM सिग्नल प्राप्त होने पर कमांड दें। प्रोग्राम का निष्पादन इस तरह दिखता है जब उपयोगकर्ता स्क्रिप्ट को दबाकर रोकने का प्रयास करता है Ctrl-सी:


[मुझे@लिनक्सबॉक्स ~]$ ट्रैप-डेमो

1 में से 5 पुनरावृत्ति

2 में से पुनरावृत्ति 5 मैं आपको अनदेखा कर रहा हूं। 3 में से 5 पुनरावृत्ति मैं आपको अनदेखा कर रहा हूँ। 4 में से 5 पुनरावृत्ति

5 में से 5 पुनरावृत्ति

[मुझे@लिनक्सबॉक्स ~]$ ट्रैप-डेमो

1 में से 5 पुनरावृत्ति

2 में से पुनरावृत्ति 5 मैं आपको अनदेखा कर रहा हूं। 3 में से 5 पुनरावृत्ति मैं आपको अनदेखा कर रहा हूँ। 4 में से 5 पुनरावृत्ति

5 में से 5 पुनरावृत्ति


जैसा कि हम देख सकते हैं, हर बार जब उपयोगकर्ता प्रोग्राम को बाधित करने का प्रयास करता है, तो इसके बजाय संदेश मुद्रित होता है।

कमांड के उपयोगी अनुक्रम को बनाने के लिए एक स्ट्रिंग का निर्माण करना अजीब हो सकता है, इसलिए शेल फ़ंक्शन को कमांड के रूप में निर्दिष्ट करना आम बात है। इस उदाहरण में, प्रत्येक सिग्नल को संभालने के लिए एक अलग शेल फ़ंक्शन निर्दिष्ट किया गया है:



#! / Bin / bash

# ट्रैप-डेमो2: सरल सिग्नल हैंडलिंग डेमो एग्जिट_ऑन_सिग्नल_एसआईजीआईएनटी () {

इको "स्क्रिप्ट बाधित।" 2>&1 निकास 0

}


बाहर निकलें_on_signal_SIGTERM () {

इको "स्क्रिप्ट समाप्त हो गई।" 2>&1 निकास 0

}


ट्रैप एग्जिट_ऑन_सिग्नल_SIGINT SIGINT ट्रैप एग्जिट_ऑन_सिग्नल_SIGTERM SIGTERM

#! / Bin / bash

# ट्रैप-डेमो2: सरल सिग्नल हैंडलिंग डेमो एग्जिट_ऑन_सिग्नल_एसआईजीआईएनटी () {

इको "स्क्रिप्ट बाधित।" 2>&1 निकास 0

}


बाहर निकलें_on_signal_SIGTERM () {

इको "स्क्रिप्ट समाप्त हो गई।" 2>&1 निकास 0

}


ट्रैप एग्जिट_ऑन_सिग्नल_SIGINT SIGINT ट्रैप एग्जिट_ऑन_सिग्नल_SIGTERM SIGTERM



मेरे लिए {1..5} में; करना

प्रतिध्वनि "पुनरावृत्ति $i का 5" नींद 5

किया


मेरे लिए {1..5} में; करना

प्रतिध्वनि "पुनरावृत्ति $i का 5" नींद 5

किया


इस स्क्रिप्ट में दो विशेषताएं हैं जाल आदेश, प्रत्येक सिग्नल के लिए एक। प्रत्येक ट्रैप, बदले में, विशेष सिग्नल प्राप्त होने पर निष्पादित किए जाने वाले एक शेल फ़ंक्शन को निर्दिष्ट करता है। एक के समावेशन पर ध्यान दें निकास प्रत्येक सिग्नल-हैंडलिंग फ़ंक्शन में कमांड। बिना एक निकास, फ़ंक्शन पूरा होने के बाद स्क्रिप्ट जारी रहेगी।

जब उपयोगकर्ता दबाता है Ctrl-सी इस स्क्रिप्ट के निष्पादन के दौरान, परिणाम इस तरह दिखते हैं:



[मुझे@लिनक्सबॉक्स ~]$ ट्रैप-डेमो2

1 में से 5 पुनरावृत्ति

2 में से 5 पुनरावृत्ति स्क्रिप्ट बाधित।

[मुझे@लिनक्सबॉक्स ~]$ ट्रैप-डेमो2

1 में से 5 पुनरावृत्ति

2 में से 5 पुनरावृत्ति स्क्रिप्ट बाधित।


की छवि

अस्थायी फ़ाइलें

सिग्नल हैंडलर को स्क्रिप्ट में शामिल करने का एक कारण अस्थायी फ़ाइलों को हटाना है जो स्क्रिप्ट निष्पादन के दौरान मध्यवर्ती परिणामों को बनाए रखने के लिए बना सकती है। अस्थायी फ़ाइलों का नामकरण करना एक कला की तरह है। परंपरागत रूप से, यूनिक्स जैसे सिस्टम पर प्रोग्राम अपनी अस्थायी फ़ाइलें बनाते हैं / Tmp निर्देशिका, ऐसी फ़ाइलों के लिए एक साझा निर्देशिका। हालाँकि, चूँकि निर्देशिका साझा की गई है, इससे कुछ सुरक्षा चिंताएँ उत्पन्न होती हैं, विशेष रूप से सुपरयूज़र विशेषाधिकारों के साथ चलने वाले कार्यक्रमों के लिए। सिस्टम के सभी उपयोगकर्ताओं के सामने आने वाली फ़ाइलों के लिए उचित अनुमतियाँ सेट करने के स्पष्ट चरण के अलावा, अस्थायी फ़ाइलों को गैर-अनुमानित फ़ाइल-नाम देना महत्वपूर्ण है। यह एक ऐसे शोषण से बचता है जिसे a के नाम से जाना जाता है अस्थायी दौड़ हमला. एक गैर-अनुमानित (लेकिन फिर भी वर्णनात्मक) नाम बनाने का एक तरीका कुछ इस तरह करना है:

tempfile=/tmp/$(बेसनाम $0).$$.$RANDOM

यह एक फ़ाइल नाम बनाएगा जिसमें प्रोग्राम का नाम, उसके बाद उसकी प्रक्रिया आईडी (पीआईडी), उसके बाद एक यादृच्छिक पूर्णांक शामिल होगा। हालाँकि, ध्यान दें कि $RAN- DOM शेल वेरिएबल केवल 1-32767 की रेंज में एक मान लौटाता है, जो कंप्यूटर के संदर्भ में बहुत बड़ी रेंज नहीं है, इसलिए वेरिएबल का एक भी उदाहरण एक निर्धारित हमलावर पर काबू पाने के लिए पर्याप्त नहीं है।



की छवि

इसका उपयोग करना एक बेहतर तरीका है एमकेटेम्प प्रोग्राम (इसके साथ भ्रमित न हों एमकेटेम्प मानक लाइब्रेरी फ़ंक्शन) दोनों को नाम दें और अस्थायी फ़ाइल बनाएं। एमके- तापमान प्रोग्राम एक टेम्पलेट को एक तर्क के रूप में स्वीकार करता है जिसका उपयोग फ़ाइल-नाम बनाने के लिए किया जाता है। टेम्प्लेट में "X" वर्णों की एक श्रृंखला शामिल होनी चाहिए, जिन्हें संबंधित संख्या में यादृच्छिक अक्षरों और संख्याओं से प्रतिस्थापित किया जाता है। "X" वर्णों की श्रृंखला जितनी लंबी होगी, यादृच्छिक वर्णों की श्रृंखला उतनी ही लंबी होगी। यहाँ एक उदाहरण है:

tempfile=$(mktemp /tmp/foobar.$$.XXXXXXXXXX)

यह एक अस्थायी फ़ाइल बनाता है और वेरिएबल को उसका नाम निर्दिष्ट करता है अस्थायी. टेम्प्लेट में "X" वर्णों को यादृच्छिक अक्षरों और संख्याओं से बदल दिया जाता है ताकि अंतिम फ़ाइल नाम (जिसमें, इस उदाहरण में, विशेष पैरामीटर का विस्तारित मान भी शामिल हो) $$ पीआईडी ​​प्राप्त करने के लिए) कुछ इस प्रकार हो सकता है:

/tmp/foobar.6593.UOZuvM6654

नियमित उपयोगकर्ताओं द्वारा निष्पादित स्क्रिप्ट के लिए, इसके उपयोग से बचना बुद्धिमानी हो सकती है / Tmp निर्देशिका बनाएं और उपयोगकर्ता की होम निर्देशिका के भीतर अस्थायी फ़ाइलों के लिए एक निर्देशिका बनाएं, इस तरह कोड की एक पंक्ति के साथ:

[[ -d $HOME/tmp ]] || एमकेडीआईआर $HOME/tmp


OnWorks पर शीर्ष OS क्लाउड कंप्यूटिंग: