2010-11-28 7 views
16

जहां तक ​​मैं पुस्तकों और बैश मैनुअल से समझता हूं वह है। जब कोई उपयोगकर्ता बैश से लॉग आउट करता है तो उपयोगकर्ता द्वारा शुरू की गई सभी पृष्ठभूमि नौकरियां स्वचालित रूप से समाप्त हो जाएंगी, अगर वह नोहप या अस्वीकार नहीं कर रहा है। लेकिन आज मैंने इसका परीक्षण किया:लॉगआउट करते समय नौकरियां कैसे काम करती हैं?

  1. मेरे gnome डेस्कटॉप में लॉग इन किया गया और gnome-terminal तक पहुंचा।
  2. टर्मिनल में दो टैब होते हैं और एक में मैं एक नया उपयोगकर्ता बुलाया परीक्षण बनाया है और परीक्षण के रूप में लॉग-इन

    su - test 
    
  3. एक स्क्रिप्ट शुरू कर दिया।

    cat test.sh 
    #!/bin/bash 
    sleep 60 
    printf "hello world!!" 
    exit 0 
    
    
    ./test.sh & 
    
  4. उसके बाद मैं परीक्षण से लॉग आउट किया और टैब बंद कर दिया

  5. अगले टैब मैं रूट के रूप में ps aux exected में और पाया कि काम अभी भी चल रहा है।

यह कैसे हो रहा है?

+0

मैंने देखा है कि इस सवाल का अभी तक एक स्वीकृत जवाब नहीं है और वहाँ जो दिलचस्प पढ़ने हो सकता है [SU] पर समान नया सवाल यह है कि: [http: // superuser.com/questions/662431/what-exactly-determines-if-a-backgrounded-job-is-killed-when-the-shell-is-exited](http://superuser.com/questions/662431/what - सटीक रूप से निर्धारित करता है-अगर-एक-पृष्ठभूमि-नौकरी-मार डाला जाता है-कब-द-खोल-बाहर निकला जाता है) – Hennes

उत्तर

2

जब आप उन्हें बंद करते हैं तो केवल इंटरैक्टिव शैल नौकरियां मारते हैं। अन्य गोले (उदाहरण के लिए जिन्हें आप su - username का उपयोग करके प्राप्त करते हैं) ऐसा न करें। और इंटरैक्टिव शैल केवल प्रत्यक्ष उपप्रजाय को मार देते हैं।

+0

मेरे मैक पर 'su' के बिना एक ही चाल। – khachik

+0

इंटरैक्टिव खोल क्या है? – Unni

+0

इंटरैक्टिव खोल क्या है? http://tldp.org/LDP/abs/html/intandnonint.html कहता है कि, यदि $ PS1 सेट किया गया है तो यह एक इंटरैक्टिव खोल है। इसके अलावा मैंने ctrl + alt + f2 का उपयोग करके एक और tty पर स्विच किया और परीक्षण के रूप में लॉग इन किया और एक ही काम किया। परिणाम एक ही है लेकिन। – Unni

12

क्या चलने पर पृष्ठभूमि की नौकरियां समाप्त हो रही हैं या नहीं, खोल पर निर्भर करता है। बैश सामान्य रूप से ऐसा नहीं करता है, लेकिन लॉगिन शैल (shopt -s huponexit) के लिए कॉन्फ़िगर किया जा सकता है। किसी भी मामले में, नियंत्रण प्रक्रिया (जैसे लॉगिन खोल) समाप्त होने के बाद टीटीई तक पहुंच असंभव है।

हालात कि हमेशा SIGHUP कारण है में शामिल हैं:

  • अग्रभूमि में कुछ भी जब tty को बंद कर दिया गया है।
  • कोई भी पृष्ठभूमि नौकरी जिसमें रोकथाम प्रक्रिया शामिल होती है जब उनका खोल समाप्त हो जाता है (SIGCONT और SIGHUP)। शेल आमतौर पर ऐसा होने से पहले आपको चेतावनी देते हैं।

huponexit सारांश:

$ shopt -s huponexit; shopt | grep huponexit 
huponexit  on 
# Background jobs will be terminated with SIGHUP when shell exits 

$ shopt -u huponexit; shopt | grep huponexit 
huponexit  off 
# Background jobs will NOT be terminated with SIGHUP when shell exits 
+2

तो आप यह कह रहे हैं कि, यदि huponexit विकल्प सेट नहीं है तो बैश उपयोगकर्ताओं की पृष्ठभूमि नौकरियों को नहीं मार पाएगा? – Unni

+0

@Unni - यदि 'huponexit' सेट है, तो बैश सभी नौकरियों के लिए SIGHUP भेज देगा जब एक इंटरैक्टिव लॉगिन खोल बाहर निकलता है (या तो ** निकास ** या ** Ctrl + d ** के साथ)। –

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