linux - समझ - हिन्दी में लिनक्स बूटिंग प्रक्रिया




क्या लिनक्स में कोई मानक निकास स्थिति कोड है? (7)

भाग 1: उन्नत बैश स्क्रिप्टिंग गाइड

हमेशा की तरह, उन्नत बैश स्क्रिप्टिंग गाइड में बहुत अच्छी जानकारी है : (यह किसी अन्य उत्तर में जुड़ा हुआ था, लेकिन एक गैर-कैनोलिक यूआरएल के लिए।)

1: सामान्य त्रुटियों के लिए कैचल
2: शैल बिल्टिन का दुरुपयोग (बैश दस्तावेज के अनुसार)
126: कमाना आदेश निष्पादित नहीं कर सकता है
127: "कमांड नहीं मिला"
128: बाहर निकलने के लिए अवैध तर्क
128 + एन: घातक त्रुटि संकेत "एन"
255: सीमा से बाहर निकलने की स्थिति (निकास 0 - 255 में केवल पूर्णांक तर्क लेता है)

भाग 2: sysexits.h

एबीएसजी संदर्भ sysexits.h

लिनक्स पर:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */

माना जाता है कि लिनक्स में एक प्रक्रिया सही ढंग से पूरी हो चुकी है, अगर इसकी निकास स्थिति 0 थी।
मैंने देखा है कि सेगमेंटेशन दोषों के परिणामस्वरूप अक्सर 11 की निकास स्थिति होती है, हालांकि मुझे नहीं पता कि यह केवल वह सम्मेलन है जहां मैं काम करता हूं (ऐसे ऐप्स जो असफल हो गए हैं) सभी या आंतरिक हैं।

लिनक्स में प्रक्रियाओं के लिए मानक निकास कोड हैं?


0 अर्थ सफलता से अलग, कोई मानक निकास कोड नहीं हैं। गैर-शून्य का मतलब विफलता का मतलब नहीं है।

stdlib.h EXIT_FAILURE को 1 और EXIT_SUCCESS को 0 के रूप में परिभाषित करता है, लेकिन यह इसके बारे में है।

सेगफॉल्ट पर 11 दिलचस्प है, क्योंकि 11 सिग्नल नंबर है जो कर्नेल एक सेगफॉल्ट की स्थिति में प्रक्रिया को मारने के लिए उपयोग करता है। कुछ तंत्र, या तो कर्नेल या खोल में, जो बाहर निकलने वाले कोड में अनुवाद करता है।


जब लिनक्स 0 देता है, तो इसका मतलब सफलता है। कुछ और मतलब विफलता है, प्रत्येक कार्यक्रम के अपने निकास कोड हैं, इसलिए यह उन सभी को सूचीबद्ध करने में काफी लंबा होगा ...!

11 त्रुटि कोड के बारे में, यह वास्तव में सेगमेंटेशन गलती संख्या है, जिसका अर्थ है कि प्रोग्राम ने एक स्मृति स्थान तक पहुंचाया था जिसे असाइन नहीं किया गया था।


पहले अनुमान के लिए, 0 sucess है, शून्य शून्य विफलता है, 1 सामान्य विफलता के साथ, और एक से अधिक कुछ एक विशिष्ट विफलता होने के साथ बड़ा है। झूठी और परीक्षण के छोटे अपवादों के अलावा, जो दोनों को सफलता के लिए 1 देने के लिए डिज़ाइन किया गया है, मुझे कुछ अन्य अपवाद भी मिले हैं।

अधिक यथार्थवादी रूप से, 0 का मतलब है सफलता या शायद विफलता, 1 का अर्थ है सामान्य विफलता या शायद सूस, 2 का मतलब सामान्य विफलता है यदि 1 और 0 दोनों को सफलता के लिए उपयोग किया जाता है, लेकिन हो सकता है कि यह भी हो।

Diff कमांड 0 देता है अगर तुलना की गई फाइलें समान हैं, 1 यदि वे भिन्न हैं, और 2 यदि बाइनरी अलग हैं। 2 भी विफलता का मतलब है। कमांड विफलता के लिए 1 देता है जब तक कि आप कोई तर्क देने में असफल रहते हैं, इस स्थिति में, यह असफल होने के बावजूद 0 से बाहर निकलता है।

अधिक कमांड और वर्तनी कमांड विफलता के लिए 1 देता है, जब तक विफलता अनुमति अस्वीकार नहीं होती है, कोई भी फ़ाइल नहीं है, या निर्देशिका को पढ़ने का प्रयास नहीं किया जाता है। इनमें से किसी भी मामले में, वे विफल होने के बावजूद 0 से बाहर निकलें।

तब expr कमांड sucess के लिए 1 देता है जब तक कि आउटपुट खाली स्ट्रिंग या शून्य न हो, उस स्थिति में, 0 sucess है। 2 और 3 विफलता हैं।

फिर ऐसे मामले हैं जहां सफलता या विफलता संदिग्ध है। जब grep एक पैटर्न खोजने में विफल रहता है, तो यह 1 से बाहर निकलता है, लेकिन यह वास्तविक विफलता के लिए 2 से बाहर निकलता है (जैसे अनुमति अस्वीकार)। जब भी यह टिकट खोजने में विफल रहता है तो कलिस्ट भी बाहर निकलती है, हालांकि यह वास्तव में किसी भी विफलता की तुलना में अधिक नहीं है जब grep को पैटर्न नहीं मिलता है, या जब आप खाली निर्देशिका लेते हैं।

इसलिए, दुर्भाग्यवश, यूनिक्स शक्तियां जो नियमों के किसी भी लॉजिकल सेट को लागू नहीं करती हैं, यहां तक ​​कि बहुत सामान्य रूप से उपयोग किए जाने वाले निष्पादन योग्य भी हैं।


सामान्य त्रुटियों के लिए 1 कैचल

2 खोल निर्माण के दुरुपयोग (बैश दस्तावेज के अनुसार)

126 आदेश दिया गया आदेश निष्पादित नहीं कर सकता है

127 "कमांड नहीं मिला"

128 बाहर निकलने के लिए अवैध तर्क

128 + एन घातक त्रुटि संकेत "एन"

नियंत्रण-सी द्वारा समाप्त 130 स्क्रिप्ट

सीमा से 255 बाहर निकलें स्थिति

यह बाश के लिए है। हालांकि, अन्य अनुप्रयोगों के लिए, अलग-अलग निकास कोड हैं।


सामान्य समाप्ति के लिए असली, दीर्घकालिक निकास स्थिति सम्मेलन यहां है (सिग्नल द्वारा नहीं):

  • बाहर निकलें स्थिति 0: सफलता
  • प्रोग्राम से परिभाषित स्थिति 1: "विफलता" से बाहर निकलें
  • बाहर निकलें स्थिति 2: कमांड लाइन उपयोग त्रुटि

उदाहरण के लिए, diff 0 देता है अगर इसकी तुलना की गई फ़ाइलें समान हैं, और 1 यदि वे भिन्न हैं। लंबे समय तक चलने वाले सम्मेलन से, यूनिक्स प्रोग्राम गलत तरीके से बुलाए जाने पर बाहर निकलने की स्थिति 2 लौटाते हैं (अज्ञात विकल्प, तर्कों की गलत संख्या इत्यादि) उदाहरण के लिए, diff -N , grep -Y या diff abc का परिणाम $? 2 पर सेट किया जा रहा है। यह 1 9 70 के दशक में यूनिक्स के शुरुआती दिनों से अभ्यास रहा है।

स्वीकार्य उत्तर बताता है कि सिग्नल द्वारा कमांड समाप्त होने पर क्या होता है संक्षेप में, बिना किसी सिग्नल के कारण समाप्ति स्थिति 128+[<signal number> । उदाहरण के लिए, SIGINT ( सिग्नल 2 ) द्वारा समाप्त होने से बाहर निकलने की स्थिति 130 होती है।

टिप्पणियाँ

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

  2. कई उत्तरों निकास स्थिति 2 को "बैश बिल्टिन का दुरुपयोग" के रूप में परिभाषित करते हैं। यह तब लागू होता है जब बैश (या एक बैश स्क्रिप्ट) स्थिति 2 से बाहर निकलता है। इसे गलत उपयोग त्रुटि का एक विशेष मामला मानें।

  3. sysexits.h में, सबसे लोकप्रिय उत्तर में उल्लिखित, बाहर निकलने की स्थिति EX_USAGE ("कमांड लाइन उपयोग त्रुटि") को 64 के रूप में परिभाषित किया गया है। लेकिन यह वास्तविकता को प्रतिबिंबित नहीं करता है: मुझे किसी भी सामान्य यूनिक्स उपयोगिता से अवगत नहीं है जो गलत पर 64 लौटाता है आमंत्रण (उदाहरण स्वागत है)। स्रोत कोड की सावधानीपूर्वक पढ़ने से पता चलता है कि sysexits.h वास्तविक उपयोग के प्रतिबिंब के बजाय महत्वाकांक्षी है:

     *    This include file attempts to categorize possible error
     *    exit statuses for system programs, notably delivermail
     *    and the Berkeley network.
    
     *    Error numbers begin at EX__BASE [64] to reduce the possibility of 
     *    clashing with oth­er exit statuses that random programs may 
     *    already return. 
    

    दूसरे शब्दों में, ये परिभाषाएं उस समय (1 99 3) के सामान्य अभ्यास को प्रतिबिंबित नहीं करतीं लेकिन जानबूझकर इसके साथ असंगत थीं। अधिक दयालुता है।


रिटर्न कोड के 8 बिट्स और हत्या सिग्नल की संख्या के 8 बिट्स को wait(2) और सह से वापसी पर एक ही मूल्य में मिश्रित किया जाता है

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

आप बाहर निकलने की स्थिति का निर्धारण कैसे कर रहे हैं? परंपरागत रूप से, खोल केवल 8-बिट रिटर्न कोड स्टोर करता है, लेकिन प्रक्रिया को असामान्य रूप से समाप्त होने पर उच्च बिट सेट करता है।

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

यदि आप इसके अलावा कुछ और देख रहे हैं, तो प्रोग्राम में शायद एक SIGSEGV सिग्नल हैंडलर है जो तब सामान्य रूप से exit , इसलिए यह वास्तव में सिग्नल द्वारा मार नहीं रहा है। (कार्यक्रम SIGKILL और SIGSTOP से अलग किसी भी सिग्नल को संभालने के लिए चुना जा सकता है।)





exit-code