जवाबों:
nohup
आदेश केवल करने के लिए लिखते हैं nohup.out
, तो उत्पादन अन्यथा टर्मिनल के लिए जाना होगा। यदि आपने कमांड के आउटपुट को कहीं और से अप्रत्यक्ष रूप से शामिल कर लिया है - जिसमें /dev/null
- इसके बजाय यह कहाँ जाता है।
nohup command >/dev/null 2>&1 # doesn't create nohup.out
यदि आप उपयोग कर रहे हैं nohup
, तो इसका मतलब है कि आप &
पूरी बात के अंत में एक और डालकर पृष्ठभूमि में कमांड चलाना चाहते हैं :
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
लिनक्स पर, किसी कार्य को nohup
स्वचालित रूप से चलाने के साथ ही उसका इनपुट भी बंद हो जाता है। अन्य प्रणालियों पर, विशेष रूप से बीएसडी और मैकओएस, ऐसा नहीं है, इसलिए जब पृष्ठभूमि में चल रहा हो, तो आप मैन्युअल रूप से इनपुट बंद करना चाह सकते हैं। हालांकि क्लोजिंग इनपुट का निर्माण या नहीं पर कोई प्रभाव नहीं है nohup.out
, यह एक और समस्या से बचा जाता है: यदि एक पृष्ठभूमि प्रक्रिया मानक इनपुट से कुछ भी पढ़ने की कोशिश करती है, तो यह रुक जाएगा, आप इसे फिर से अग्रभूमि में लाने और कुछ टाइप करने के लिए इंतजार कर रहे हैं। तो अतिरिक्त-सुरक्षित संस्करण इस तरह दिखता है:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
ध्यान दें, हालांकि, यह कमांड को सीधे टर्मिनल तक पहुंचने से नहीं रोकता है, और न ही इसे आपके शेल के प्रोसेस ग्रुप से हटाता है। यदि आप उत्तरार्द्ध करना चाहते हैं, और आप बैश, ksh, या zsh चला रहे हैं, तो आप disown
अगले आदेश के रूप में बिना किसी तर्क के साथ चलकर ऐसा कर सकते हैं । इसका मतलब यह होगा कि पृष्ठभूमि प्रक्रिया अब शेल "नौकरी" से जुड़ी नहीं है और इसमें शेल से आगे भेजे गए कोई संकेत नहीं होंगे। (ध्यान दें: एक disown
एड प्रक्रिया को अपने माता-पिता के शेल द्वारा स्वचालित रूप से इसके लिए भेजे गए कोई संकेत नहीं मिलते हैं - लेकिन इसके बिना nohup
, यह अभी भी HUP
अन्य साधनों के माध्यम से भेजे गए सिग्नल को प्राप्त करेगा , जैसे कि एक मैनुअल kill
कमांड। nohup
'एड प्रक्रिया किसी भी और सभी HUP
सिग्नलों को अनदेखा करती है, कोई फर्क नहीं पड़ता कि उन्हें कैसे भेजा जाता है।)
स्पष्टीकरण:
यूनिक्स सिस्टम में, इनपुट के प्रत्येक स्रोत या आउटपुट के लक्ष्य के साथ एक नंबर जुड़ा होता है, जिसे "फ़ाइल डिस्क्रिप्टर" या शॉर्ट के लिए "fd" कहा जाता है। प्रत्येक चलने वाले कार्यक्रम ("प्रक्रिया") का अपना एक सेट होता है, और जब एक नई प्रक्रिया शुरू होती है, तो इसमें से तीन पहले से ही खुले होते हैं: "मानक इनपुट", जो कि fd 0 है, प्रक्रिया से पढ़ने के लिए खुला है, जबकि "मानक आउटपुट" (fd 1) और "मानक त्रुटि" (fd 2) इसके लिए लिखने के लिए खुले हैं। यदि आप बस टर्मिनल विंडो में एक कमांड चलाते हैं, तो डिफ़ॉल्ट रूप से, आप जो कुछ भी टाइप करते हैं, वह उसके मानक इनपुट पर जाता है, जबकि उसके मानक आउटपुट और मानक त्रुटि दोनों उस विंडो पर भेजे जाते हैं।
लेकिन आप शेल को बदलने के लिए कह सकते हैं जहां कमांड लॉन्च करने से पहले कोई भी या सभी फ़ाइल डिस्क्रिप्टर इंगित करते हैं; बात यह है कि क्या पुनर्निर्देशन ( <
, <<
, >
, >>
) और पाइप ( |
) ऑपरेटरों से करते हैं।
पाइप इनमें से सबसे सरल है ... command1 | command2
मानक आउटपुट के command1
लिए सीधे मानक इनपुट में फ़ीड करने की व्यवस्था करता है command2
। यह एक बहुत ही आसान व्यवस्था है जिसने UNIX टूल्स में एक विशेष डिज़ाइन पैटर्न का नेतृत्व किया है (और मानक त्रुटि के अस्तित्व की व्याख्या करता है, जो प्रोग्राम को उपयोगकर्ता को संदेश भेजने की अनुमति देता है, भले ही इसका आउटपुट पाइपलाइन में अगले कार्यक्रम में जा रहा हो) । लेकिन आप केवल मानक इनपुट से मानक आउटपुट को पाइप कर सकते हैं; आप कुछ करतब दिखाने के बिना किसी भी अन्य फ़ाइल डिस्क्रिप्टर को पाइप पर नहीं भेज सकते।
पुनर्निर्देशन ऑपरेटर इसमें मित्रवत होते हैं कि वे आपको निर्दिष्ट करते हैं कि कौन सी फ़ाइल विवरणक पुनर्निर्देशित करें। इसलिए 0<infile
नामित फ़ाइल से मानक इनपुट पढ़ता है infile
, जबकि नामित फ़ाइल 2>>logfile
के अंत में मानक त्रुटि को जोड़ता है logfile
। यदि आप कोई संख्या निर्दिष्ट नहीं करते हैं, तो fd 0 के लिए इनपुट पुनर्निर्देशन डिफॉल्ट्स ( <
जैसा है 0<
), जबकि आउटपुट रीडायरेक्शन डिफॉल्ट्स को fd 1 ( >
जैसा ही है 1>
)।
इसके अलावा, आप फ़ाइल डिस्क्रिप्टर को एक साथ जोड़ सकते हैं: 2>&1
"मानक आउटपुट जहां भी जा रहा है, मानक त्रुटि भेजें"। इसका मतलब है कि आपको आउटपुट की एक एकल स्ट्रीम मिलती है जिसमें मानक आउट और मानक त्रुटि दोनों शामिल हैं जो अब उन्हें अलग करने के लिए कोई रास्ता नहीं है, लेकिन इसका मतलब यह भी है कि आप एक पाइप में मानक त्रुटि शामिल कर सकते हैं।
तो अनुक्रम का >/dev/null 2>&1
अर्थ है "मानक आउटपुट भेजें /dev/null
" (जो कि एक विशेष उपकरण है जो आप इसे जो कुछ भी लिखते हैं उसे फेंक देते हैं) "और फिर मानक त्रुटि को भेजें जहां भी मानक आउटपुट जा रहा है" (जो हमने अभी सुनिश्चित किया था /dev/null
)। असल में, "यह कमांड जो भी लिखती है उसे या तो फाइल डिस्क्रिप्टर पर फेंक दें"।
जब nohup
पता चलता है कि न तो इसकी मानक त्रुटि और न ही आउटपुट टर्मिनल से जुड़ा हुआ है, तो यह बनाने की जहमत नहीं उठाता है nohup.out
, लेकिन यह मानता है कि आउटपुट पहले से ही पुनर्निर्देशित है जहां उपयोगकर्ता चाहता है कि वह जाए।
/dev/null
डिवाइस भी इनपुट के लिए काम करता है; यदि आप के साथ एक कमांड चलाते हैं </dev/null
, तो मानक इनपुट से पढ़ने के लिए उस कमांड का कोई भी प्रयास तुरंत एंड-ऑफ-फ़ाइल का सामना करेगा। ध्यान दें कि मर्ज सिंटैक्स का यहाँ समान प्रभाव नहीं होगा; यह केवल एक फाइल डिस्क्रिप्टर को उसी दिशा (इनपुट या आउटपुट) में खोलने वाले किसी दूसरे को इंगित करने के लिए काम करता है। शेल आपको ऐसा करने देगा >/dev/null <&1
, लेकिन यह एक आउटपुट स्ट्रीम पर एक इनपुट फ़ाइल डिस्क्रिप्टर के साथ एक प्रक्रिया बनाने वाली हवाओं को बनाता है, इसलिए केवल एंड-ऑफ़-फ़ाइल को हिट करने के बजाय, कोई भी पढ़ने का प्रयास एक घातक "अमान्य फ़ाइल डिस्क्रिप्टर" त्रुटि को ट्रिगर करेगा।
nohup
, "यदि प्रक्रिया बाद में मानक इनपुट से कुछ भी पढ़ने की कोशिश करती है, तो यह रुक जाएगा, आप इसे फिर से अग्रभूमि में लाने और कुछ टाइप करने के लिए इंतजार कर रहे हैं।" गलत लगता है। इसके बजाय, nohup
मानक इनपुट बंद कर देता है (प्रोग्राम किसी भी इनपुट को पढ़ने में सक्षम नहीं होगा, भले ही यह अग्रभूमि में चलाया गया हो। यह रुका नहीं है, लेकिन एक त्रुटि कोड या ईओएफ प्राप्त करेगा)।
nohup
करता नहीं पास मानक इनपुट स्वचालित रूप से। ध्यान दें कि nohup
शेल बिलिन नहीं है बल्कि एक बाइनरी उपयोगिता है।
nohup
Linux के लिए और BSD या OS X के लिए कार्यान्वयन अलग है?
awk
अलग है, sed
अलग है, nohup
अलग है ...
</dev/null
? इसके अलावा 0>/dev/null
unix.stackexchange.com/a/266247
nohup some_command > /dev/null 2>&1&
आपको बस इतना ही करना है!
&
पर उपयोग करने की जरूरत से आप रखेंगे ctrl-c
, अगर आप के लिए है कि मायने रखती है।
some_command
त्रुटि सहित आउटपुट कैप्चरिंग के बारे में उपद्रव नहीं कर रहे हैं ।
क्या आपने तीनों I / O धाराओं को पुनर्निर्देशित करने की कोशिश की है:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
</ dev / null की बजाय / dev / null नहीं होना चाहिए ?
< /dev/null
मानक इनपुट को पुनर्निर्देशित करता है nohup
। लिनक्स को इसकी आवश्यकता नहीं है, लेकिन POSIX व्यवहार की अनुमति देता है जहां nohup
अगर यह मानक इनपुट टर्मिनल से जुड़ा है तो पृष्ठभूमि पर नहीं चल सकता है। इस तरह के सिस्टम के उदाहरण बीएसडी और ओएस एक्स हैं
आप अलग-अलग प्रोग्राम का उपयोग करना चाह सकते हैं । आप इसका उपयोग करते हैं, nohup
लेकिन जब तक आप इसे नहीं बताते हैं तब तक यह आउटपुट लॉग का उत्पादन नहीं करता है। यहाँ मैन पेज है:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
नोट: कार्यक्रम के लेखक के साथ मेरा कोई संबंध नहीं है। मैं केवल कार्यक्रम का एक संतुष्ट उपयोगकर्ता हूँ।
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Sudo के आउटपुट को रीडायरेक्ट करने के लिए sudo को पासवर्ड के लिए रीअसैक करना पड़ता है, इस प्रकार इस वेरिएंट को करने के लिए एक अजीब तंत्र की आवश्यकता होती है।
यदि आपके सामने आपके मैक / लिनक्स पर एक BASH शेल है, तो आप व्यावहारिक रूप से पुनर्निर्देशन को समझने के लिए नीचे दिए गए चरणों को आज़माते हैं:
Zz.sh नामक एक 2 लाइन स्क्रिप्ट बनाएँ
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
वर्तमान में, केवल स्क्रिप्ट निष्पादित करने से स्क्रीन पर STDOUT और STDERR दोनों को भेजा जाता है।
./zz.sh
अब मानक पुनर्निर्देशन के साथ शुरू करें:
zz.sh > zfile.txt
उपरोक्त में, "इको" (STDOUT) zfile.txt में जाता है। जबकि स्क्रीन पर "एरर" (STDERR) प्रदर्शित होता है।
ऊपर जैसा है:
zz.sh 1> zfile.txt
अब आप फ़ाइल में विपरीत, और पुनर्निर्देशित "त्रुटि" STDERR की कोशिश कर सकते हैं। "इको" कमांड से STDOUT स्क्रीन पर जाता है।
zz.sh 2> zfile.txt
उपरोक्त दोनों को मिलाकर, आपको मिलता है:
zz.sh 1> zfile.txt 2>&1
स्पष्टीकरण:
आखिरकार, आप पूरी चीज़ को nohup कमांड के अंदर पैक कर सकते हैं और इसे बैकग्राउंड में चला सकते हैं:
nohup zz.sh 1> zfile.txt 2>&1&