क्या मैं एक लॉग फ़ाइल में आउटपुट को रीडायरेक्ट कर सकता हूं और एक ही समय में एक प्रक्रिया को बैकग्राउंड कर सकता हूं?


116

क्या मैं एक लॉग फ़ाइल में आउटपुट को रीडायरेक्ट कर सकता हूं और एक ही समय में एक प्रक्रिया को बैकग्राउंड कर सकता हूं?

दूसरे शब्दों में, क्या मैं ऐसा कुछ कर सकता हूं?

nohup java -jar myProgram.jar 2>&1 > output.log &

या, यह एक कानूनी आदेश नहीं है? या, क्या मुझे इसे पृष्ठभूमि पर मैन्युअल रूप से स्थानांतरित करने की आवश्यकता है, जैसे:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
या तुमने कोशिश की? आपको क्या त्रुटि मिल रही है? इसके अलावा, मुझे यकीन नहीं है कि आपके पास एक टाइपो है, या आपके कोड में कोई त्रुटि है। 2>$1शायद माना जाता है 2>&1
पैट्रिक

जवाबों:


171

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

some_cmd > some_file 2>&1 &

और फिर आप इसे पृष्ठभूमि पर भेजने के लिए & पर फेंक सकते हैं। नौकरियों को jobsकमांड से एक्सेस किया जा सकता है । jobsआपको चल रही नौकरियां दिखाएंगे, और उन्हें नंबर देंगे। आप बाद में% का उपयोग करते हुए नौकरियों के बारे में बात कर सकते हैं जैसे संख्या kill %1या तो।

इसके अलावा, एंड के बिना आप कमांड को सस्पेंड कर सकते हैं Ctrlz, bgइसे बैकग्राउंड fgमें लाने के लिए कमांड का उपयोग कर सकते हैं और इसे अग्रभूमि में वापस ला सकते हैं। jobsकमांड के साथ संयोजन में , यह शक्तिशाली है।

आदेश लिखने के बारे में उपरोक्त भाग स्पष्ट करने के लिए। मान लें कि stderr का पता 1002 है, stdout का पता 1001 है, और फ़ाइल 1008 है। कमांड दाईं ओर बाईं ओर पढ़ती है, इसलिए पहली चीज़ 2>&1जो आपके अंदर दिखाई देती है, जो stderr को 1001 पते पर ले जाती है, फिर यह देखती है > fileकि यह stdout को 1008 पर ले जाती है लेकिन 1001 पर stderr रहता है। यह 1001 की ओर इशारा करते हुए सब कुछ नहीं खींचता है और इसे 1008 पर ले जाता है, लेकिन बस stdout को संदर्भित करता है और इसे फ़ाइल में ले जाता है।
दूसरे तरीके के चारों ओर, यह स्टैडआउट को 1008 तक ले जाता है, और फिर स्टैडर को उस बिंदु पर ले जाता है, जहां स्टडआउट 1008 को भी इंगित कर रहा है। इस तरह से दोनों सिंगल फाइल को इंगित कर सकते हैं।


इस के बाद हालांकि इस पर कब्जा करने के लिए प्रतीत नहीं कर सकते$!
chovy

8
इसके अलावा ध्यान देने योग्य: आप &> file.outस्टड और स्टडआउट दोनों को आउटपुट फ़ाइल पर पुनर्निर्देशित करने के लिए उपयोग कर सकते हैं , जो 2>&1आपकी कमांड लाइन में गलत जगह डालने के साथ गलती की संभावना को कम करता है ।
दान

14

के साथ <Ctrl+Z>पृष्ठभूमि में रोकना और जारी रखना कमांड के अंत में bgनिष्पादित करने के बराबर है &

तो, पृष्ठभूमि में चलाने के लिए और आउटपुट पुनर्निर्देशित करें:

java -jar myProgram.jar 2> errorOutput.log > output.log &

यदि आपको यह भी आवश्यकता है कि टर्मिनल से निकलते समय यह कमांड नहीं मरता है, तो आपको उपयोग करना चाहिए nohup


ओह मैं समझा। आप कह रहे हैं कि एप्लाइड '&' चार बेमानी है?
djangofan

मैं सिर्फ मैनपेज उद्धृत करता हूं। चूँकि nohup किसी भी तरह से बैकग्राउंड में कमांड को निष्पादित करेगा, इसलिए बैकग्राउंड में nohup को निष्पादित करने के लिए बेमानी लगता है
RSFalcon7

10
nohup पृष्ठभूमि में कमांड निष्पादित नहीं करता है, आपको स्पष्ट रूप से संलग्न करना होगा&
jlliagre

3
bgआपके द्वारा पृष्ठभूमि के साथ एक प्रक्रिया को स्थानांतरित करने के बाद , आप इसे चलाकर अपने सत्र से अलग कर सकते हैं disown, जो बनाता है कि जब आप टर्मिनल को बंद करते हैं तो यह प्रक्रिया मरती नहीं है।
कोएन।

14
java -jar myProgram.jar &> output.log &

ध्यान दें कि &>निर्देशन दोनों stdout और stderr को output.log में करता है


3
एक-लाइन स्पष्टीकरण उत्तर को पूर्ण बना देगा।
अनिक

2
@ abhisheknaik96 यह jar फाइल चलाता है और स्टडिन और stderr दोनों को output.log पर रीडायरेक्ट करता है और बैकग्राउंड प्रोसेस बनाता है।
पी। पंग

2

नोह का उपयोग करने के बजाय आप स्क्रीन का उपयोग कर सकते हैं। आप वास्तविक समय में कार्यक्रम की स्थिति देख सकते हैं। आप सभी आउटपुट को एक फ़ाइल में लॉग इन कर सकते हैं। जब आप खराब कनेक्शन या निष्क्रियता के कारण लॉग आउट हो जाते हैं तो यह सर्वर के माध्यम से एक्सेस करने के लिए उपयोगी होता है। आप में लॉग इन करने के बाद आप जहां से चले थे वहां काम जारी रख सकते हैं। इसे और इसे विस्तार से जानने के लिए देखें ।


1

teeआदेश भी बहुत प्रचलित है।

nohup java -jar myProgram.jar | tee output.log &

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