Nohup आउटपुट फ़ाइल में लॉग नहीं लिख रहा है


141

मैं पृष्ठभूमि में एक अजगर स्क्रिप्ट चलाने के लिए निम्नलिखित कमांड का उपयोग कर रहा हूं:

nohup ./cmd.py > cmd.log &

लेकिन ऐसा लगता है कि nohup लॉग फ़ाइल में कुछ भी नहीं लिख रहा है। cmd.log बनाया गया है लेकिन हमेशा खाली है। अजगर स्क्रिप्ट में, मैं मानक आउटपुट पर प्रिंट करने के sys.stdout.writeबजाय उपयोग कर रहा हूं print। क्या मैं गलत हूं?


आप किस संस्करण का nohupउपयोग कर रहे हैं? बीएसडी संस्करण nohup.outवर्तमान निर्देशिका में (या $HOME/nohup.outयदि वर्तमान निर्देशिका लिखने योग्य नहीं है) नामक फ़ाइल को लिखता है । मुझे आउटपुट फ़ाइल नाम बदलने का कोई तरीका नहीं दिखता ...
wulong

@wulong केवल अगर stdout एक टर्मिनल है।
जॉन कुगेलमैन

मैंने पुनर्निर्देशन के बिना भी कमांड की कोशिश की और इसने nohup.out फ़ाइल बिल्कुल नहीं बनाई। मुझे नहीं पता कि यह कौन सा संस्करण है, लेकिन मैं SunOS 5.10 पर हूं अगर यह मदद करता है।

जवाबों:


103

ऐसा लगता है कि आपको समय-समय पर (जैसे sys.stdout.flush()) स्टडआउट को फ्लश करने की आवश्यकता है । मेरे परीक्षण में पायथन printकार्यक्रम के बाहर निकलने तक भी स्वचालित रूप से ऐसा नहीं करता है।


17
अजगर के साथ-साथ अन्य सी stdio- आधारित कार्यक्रम इंटरैक्टिव मामले में लाइन-बफ़रिंग का उपयोग करता है (स्टडआउट एक ट्टी से जुड़ा है) और ब्लॉक-बफ़रिंग जब किसी फ़ाइल पर रीडायरेक्ट की जाती है। अगर python -uकाम नहीं करता; nohupशायद अपनी खुद की बफरिंग पेश की है।
jfs

12
@JFSebastian आज के रूप में, nohupबफर आउटपुट नहीं python -uकरता है और ठीक काम करता है। (लोगों के लिए सिर्फ एक अपडेट)
पिजसुएन

1
@ पायस: nohupएक POSIX उपयोगिता है जो विभिन्न प्लेटफार्मों पर अलग-अलग कार्यान्वयन हो सकती है। btw, python3 I / O अब C stdio- आधारित नहीं है, लेकिन इसमें समान बफ़रिंग व्यवहार है।
jfs 16

381

-uआउटपुट बफ़रिंग से बचने के लिए आप ध्वज के साथ पायथन चला सकते हैं :

nohup python -u ./cmd.py > cmd.log &

12
यह बेहतर है! बहुत बहुत धन्यवाद :)
सदजाद

@kommradHomer मुझे लगता है कि यह stdout / stderr पर आउटपुट की मात्रा पर निर्भर करता है जो आपके प्रोग्राम का उत्पादन करता है।
vz0

1
एक जादू की तरह काम करता है। मुझे भी लगता है कि यह सही के रूप में चयनित एक से बेहतर उत्तर है। क्या आप दूसरों को भ्रमित न करने के लिए इसे सही मान सकते हैं?
ओन्ड्रेज बर्कर्ट

1
चेतावनी: यह हमेशा काम नहीं करता है । मुझे पता नहीं क्यों। क्या आप?
बसज

3
यह स्वीकृत उत्तर होना चाहिए ... मैंने जो चाहा, वह किया। धन्यवाद!
21

42
  • मेरे लिए काम करने के -u साथ उपयोग करना nohup। के प्रयोग -uसे बल मिलेगा stdout,stderr unbuffered होने की धाराओं। इसका असर स्टड पर नहीं पड़ेगा। सब कुछ " nohup.out " फ़ाइल में सहेजा जाएगा । ऐशे ही-

    nohup python -u your_code.py &

    आप इसे अपनी निर्देशिका में भी सहेज सकते हैं। इस तरफ-

    nohup python -u your_code.py > your_directory/nohup.out &
  • इसके अलावा, आप उपयोग कर सकते हैं PYTHONUNBUFFERED । यदि आप इसे एक गैर-रिक्त स्ट्रिंग पर सेट करते हैं तो यह -uविकल्प के समान काम करेगा । अजगर कोड चलाने से पहले इस रन कमांड के नीचे का उपयोग करने के लिए।

    export PYTHONUNBUFFERED=1

    या

    export PYTHONUNBUFFERED=TRUE

PS- मैं पृष्ठभूमि और अनुसूचित निष्पादन में चीजों को चलाने के लिए क्रोन-जॉब जैसे उपकरणों का उपयोग करने का सुझाव दूंगा।


@ Vz0 से उत्तर के साथ क्या अंतर है?
०४:

1
@Deqing में कोई अंतर नहीं है।
ओवरकोड


2

पायथन 3.3 और इसके बाद के संस्करण को प्रिंट करने के लिए एक फ्लश तर्क है और यह एकमात्र तरीका है जो मेरे लिए काम करता है।

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

मेरे पास एक समान मुद्दा था, लेकिन पायथन प्रक्रिया से जुड़ा नहीं था। मैं एक स्क्रिप्ट चला रहा था, जिसमें नोह और स्क्रिप्ट समय-समय पर क्रोन के माध्यम से चलती थी।

मैं इस समस्या को हल करने में सक्षम था:

  1. स्टड, स्टडआउट और स्टेडर को पुनर्निर्देशित करना
  2. नोह के माध्यम से ली जा रही स्क्रिप्ट को सुनिश्चित करना पृष्ठभूमि में कुछ और नहीं चला

पुनश्च: मेरी पटकथा आरएचईएल पर चलने वाली ksh में लिखी गई थी

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