डिसाइड कमांड को वेरिफाई करें


10

मुझे ^z; bg; disownअनुक्रम जारी करने के लिए मुझे एक ssh सत्र बंद करने की अनुमति देने के लिए जिसमें मैं एक सुपर-महत्वपूर्ण लंबे समय से चलने वाली प्रक्रिया चला रहा हूं। यह प्रक्रिया stderr को स्टेटस आउटपुट लिखती है, और अलग होने के बाद भी ऐसा करना जारी रखा है (lsof के साथ सत्यापित किया गया है, stderr fd r / w के लिए खुला है)।

क्या यह निर्धारित करने का एक तरीका है कि प्रक्रिया वास्तव में विघटित हो गई है (क्या शेल को फिर से शुरू नहीं किया जाएगा यदि शेल एक पुनरावृत्ति करता है)?


1
मुझे आश्चर्य है कि अगर इसके लिए unix.stackexchange.com
Rilindo

2
बस उत्सुक, क्यों नहीं: $ प्रक्रिया 1 >> / जड़ / std.out 2 >> / जड़ / इरेटा और
एवरी पायने

जवाबों:


12

बैश में, disownस्वयं द्वारा जारी की गई कमांड सक्रिय जॉब टेबल से पृष्ठभूमि वाली (थ्रू ) bgया &प्रक्रियाओं को हटा देगी , और लॉगआउट पर साइटश प्राप्त नहीं करने के लिए उन्हें चिह्नित करेगी ।

आप एक या एक से अधिक नौकरियों को पास करने के लिए भी दे सकते हैं, जैसे disown 1 3disown -hआप तालिका में नौकरियों रखना चाहते हैं झंडा उपयोगी है, लेकिन अभी भी लॉग आउट करने पर SIGHUP नहीं।

आप jobsकमांड जारी करके जॉब टेबल देख सकते हैं । एक सफल पृष्ठभूमि के बाद, यह दिखाएगा [1]+ command &। नौकरी छोड़ने के बाद, उसे अब नौकरी की तालिका में प्रदर्शित नहीं किया जाना चाहिए, और अब लॉगआउट पर नहीं मारा जाना चाहिए। तुम अब भी के माध्यम से प्रक्रिया को देख सकते हैं ps ux, topऔर अन्य प्रक्रिया देखने उपयोगिताओं।

नौकरी छूट जाने के बाद, आप इसे स्वाभाविक रूप से समाप्त करने के लिए प्रतीक्षा कर सकते हैं या killइसे रोकने के लिए पीआईडी ​​के माध्यम से एक संकेत भेज सकते हैं।

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

उदाहरण:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

मैं आमतौर पर केवल तभी उपयोग करता disownहूं जब मैं संभावित रूप से लंबे समय तक चलने वाली कमांड चलाता हूं जैसे कि rsyncया cpबाद में यह तय करता हूं कि मुझे इसे समाप्त किए बिना लॉग आउट करने की आवश्यकता है। यदि आप जानते हैं कि आप एक कमांड चलाने जा रहे हैं और लॉग आउट कर रहे हैं, तो आप आउटपुट को पाइप से कैप्चर कर सकते हैं या teeइसे किसी फाइल में डाल सकते हैं, इसके साथ इसे चला सकते हैं nohup, या इसे चला सकते हैं screen(जो आपको कमांड के स्वामित्व को फिर से लेने / बाद में समाप्त करने की अनुमति देता है) )।

उदाहरण:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null

1
+1 सूचनात्मक और उदाहरण के साथ। अच्छा!
एंडी स्मिथ

बहुत जानकारीपूर्ण टिप्पणी; क्या आप कह रहे हैं कि किसी प्रक्रिया की टुकड़ी को सत्यापित करना संभव नहीं है (इसके अलावा कि यह अब नौकरियों की तालिका में मौजूद नहीं है)?
mikewaters

1
जब आप detachएक पृष्ठभूमि वाली नौकरी पर दौड़ते हैं , तो यह अलग होने वाला है :) वहाँ वास्तव में एक मध्य मैदान नहीं है जहां एक पृष्ठभूमि वाली प्रक्रिया पर इसे चलाने से कुछ नहीं होगा। जाँच करना jobsकेवल यह बताता है कि आपने किसी रुकी हुई प्रक्रिया या किसी चीज़ को अलग करने की कोशिश नहीं की।
lunixbochs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.