मैं nohup.out प्राप्त किए बिना nohup कमांड का उपयोग कैसे करूं?


309

मुझे nohup कमांड की समस्या है।

जब मैं अपना काम चलाता हूं, तो मेरे पास बहुत सारा डेटा होता है। आउटपुट nohup.out बहुत बड़ा हो जाता है और मेरी प्रक्रिया धीमी हो जाती है। मैं इस कमांड को nohup.out के बिना कैसे चला सकता हूं?


जवाबों:


612

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, लेकिन यह एक आउटपुट स्ट्रीम पर एक इनपुट फ़ाइल डिस्क्रिप्टर के साथ एक प्रक्रिया बनाने वाली हवाओं को बनाता है, इसलिए केवल एंड-ऑफ़-फ़ाइल को हिट करने के बजाय, कोई भी पढ़ने का प्रयास एक घातक "अमान्य फ़ाइल डिस्क्रिप्टर" त्रुटि को ट्रिगर करेगा।


1
के बारे में nohup, "यदि प्रक्रिया बाद में मानक इनपुट से कुछ भी पढ़ने की कोशिश करती है, तो यह रुक जाएगा, आप इसे फिर से अग्रभूमि में लाने और कुछ टाइप करने के लिए इंतजार कर रहे हैं।" गलत लगता है। इसके बजाय, nohup मानक इनपुट बंद कर देता है (प्रोग्राम किसी भी इनपुट को पढ़ने में सक्षम नहीं होगा, भले ही यह अग्रभूमि में चलाया गया हो। यह रुका नहीं है, लेकिन एक त्रुटि कोड या ईओएफ प्राप्त करेगा)।
टिम

1
@Tim - कि इस सवाल का जवाब है, जिस पर लिनक्स के लिए, लेकिन बीएसडी या ओएस एक्स के लिए नहीं सही है, nohupकरता नहीं पास मानक इनपुट स्वचालित रूप से। ध्यान दें कि nohupशेल बिलिन नहीं है बल्कि एक बाइनरी उपयोगिता है।
मार्क रीड

नॉहूप कोर्यूटिल्स का हिस्सा है। क्या आपका मतलब है कि nohupLinux के लिए और BSD या OS X के लिए कार्यान्वयन अलग है?
टिम

हाँ। "कोरुटिल्स" नाम जीएनयू पैकेज को संदर्भित करता है। लेकिन बीएसडी, ओएस एक्स, स्मार्टओएस / इलुमोस और कई वाणिज्यिक यूनिक्स - मूल रूप से, जो कि जीएनयू की तुलना में लगभग लंबे समय से हैं - गैर-जीएनयू कोर उपयोगिताओं हैं। awkअलग है, sedअलग है, nohupअलग है ...
मार्क रीड

आपने "अतिरिक्त सुरक्षित" क्यों लिखा </dev/null? इसके अलावा 0>/dev/null unix.stackexchange.com/a/266247
टिम

68
nohup some_command > /dev/null 2>&1&

आपको बस इतना ही करना है!


4
एक और जवाब था कि लगभग यही बात थी, लेकिन उनके पास अंत में अतिरिक्त "और" नहीं था।
१११०११०१ बी २२'१२

10
&पर उपयोग करने की जरूरत से आप रखेंगे ctrl-c, अगर आप के लिए है कि मायने रखती है।
सनस्पार्क

1
बीजी में चलाने की क्षमता बहुत सहायक है
ist_lion

यह केवल तभी उपयोगी है जब आप some_commandत्रुटि सहित आउटपुट कैप्चरिंग के बारे में उपद्रव नहीं कर रहे हैं ।
wulfgarpro

12

क्या आपने तीनों I / O धाराओं को पुनर्निर्देशित करने की कोशिश की है:

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &

1
क्या यह ></ dev / null की बजाय / dev / null नहीं होना चाहिए ?
स्कॉट चू

3
@ScottChu < /dev/nullमानक इनपुट को पुनर्निर्देशित करता है nohup। लिनक्स को इसकी आवश्यकता नहीं है, लेकिन POSIX व्यवहार की अनुमति देता है जहां nohupअगर यह मानक इनपुट टर्मिनल से जुड़ा है तो पृष्ठभूमि पर नहीं चल सकता है। इस तरह के सिस्टम के उदाहरण बीएसडी और ओएस एक्स हैं
मिकोको रैंटलैनेन

8

आप अलग-अलग प्रोग्राम का उपयोग करना चाह सकते हैं । आप इसका उपयोग करते हैं, 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.

नोट: कार्यक्रम के लेखक के साथ मेरा कोई संबंध नहीं है। मैं केवल कार्यक्रम का एक संतुष्ट उपयोगकर्ता हूँ।


2
लिंक टूटा नहीं है और वह git रेपो पुराना है। इसमें वर्तमान v0.2.3 शामिल नहीं है।
दान डी।

5

निम्न आदेश आपको nohup.out प्राप्त किए बिना पृष्ठभूमि में कुछ चलाने देगा:

nohup command |tee &

इस प्रकार, आप दूरस्थ सर्वर पर स्क्रिप्ट चलाते समय कंसोल आउटपुट प्राप्त करने में सक्षम होंगे: यहां छवि विवरण दर्ज करें


4
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

Sudo के आउटपुट को रीडायरेक्ट करने के लिए sudo को पासवर्ड के लिए रीअसैक करना पड़ता है, इस प्रकार इस वेरिएंट को करने के लिए एक अजीब तंत्र की आवश्यकता होती है।


1

यदि आपके सामने आपके मैक / लिनक्स पर एक BASH शेल है, तो आप व्यावहारिक रूप से पुनर्निर्देशन को समझने के लिए नीचे दिए गए चरणों को आज़माते हैं:

Zz.sh नामक एक 2 लाइन स्क्रिप्ट बनाएँ

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • इको कमांड का आउटपुट STDOUT फाइलस्ट्रीम (फाइल डिस्क्रिप्टर 1) में जाता है।
  • त्रुटि कमांड का आउटपुट STDERR फाइलस्ट्रीम में जाता है (फाइल डिस्क्रिप्टर 2)

वर्तमान में, केवल स्क्रिप्ट निष्पादित करने से स्क्रीन पर 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

स्पष्टीकरण:

  • FIRST, zDile.txt को STDOUT 1 भेजें
  • फिर, STDERR 2 को STDOUT 1 को स्वयं भेजें (और 1 सूचक का उपयोग करके)।
  • इसलिए, 1 और 2 दोनों एक ही फ़ाइल में जाते हैं (zfile.txt)

आखिरकार, आप पूरी चीज़ को nohup कमांड के अंदर पैक कर सकते हैं और इसे बैकग्राउंड में चला सकते हैं:

nohup zz.sh 1> zfile.txt 2>&1&

1

आप नीचे कमांड चला सकते हैं।

nohup <your command> & >  <outputfile> 2>&1 &

उदाहरण के लिए मेरे पास स्क्रिप्ट के अंदर एक नॉहप कमांड है

./Runjob.sh > sparkConcuurent.out 2>&1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.