जिस तरह से मेरा होस्टर चीजों को करता है, मुझे सेवाओं के लिए एक प्रणाली का उपयोग करना पड़ता है।
इस सेवा में एक रन फ़ाइल होती है जिसे यह एक दूसरे रन फ़ाइल में निष्पादित और पाइप करता है। लेकिन मैं एक (दिए गए) अजगर पैकेज का उपयोग करता हूं जो stdout के बजाय stderr में लॉग होता है और मैं इसे वह नहीं कर पाता जो मैं चाहता हूं।
इसलिए मेरे पास मेरी सेवा के लिए एक रन स्क्रिप्ट है:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
जिसे लॉगिंग सिस्टम के रन में पाइप किया गया है:
#!/bin/sh
exec multilog t ./main
लेकिन पाइप stderr (जैसा कि अपेक्षित है) को जोड़ता नहीं है। इसलिए गुग्लिंग के बाद मैंने अपने रन पर पुनर्निर्देशन किया:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1
लेकिन यह मेरी समस्या को हल नहीं करता है: मेरे अपने आउटपुट (अजगर प्रिंट का उपयोग करने के लिए स्टडआउट) उम्मीद के अनुसार लॉग किए गए हैं। Stderr आउटपुट लॉग नहीं है।
यदि मैं अपनी संशोधित रनस्क्रिप्ट को दो फ़ाइलों में पुनर्निर्देशित करता हूं, तो यह दर्शाता है कि कोई पुनर्निर्देशन नहीं है (stderr अभी भी stderr पर है)। मुझे अपने पुनर्निर्देशन को काम करने के लिए कैसे संशोधित करना होगा?
dup2()
कोड में कॉल देखें । किसी भी विचार जहां stderr उत्पादन किया जाता है जा रहे हैं? एक और विचार: शायद आपके होस्ट की रन फ़ाइल आपके कोड को शुरू करने से पहले इस तरह से पुनर्निर्देशित कर रही है।
import sys; print("Hello, stderr", file=sys.stderr)
निश्चित हो।
exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
और इस logfiles में एक नज़र रखना।
exec ... 2>&1
वास्तव में मानक त्रुटि को मानक आउट में शामिल करता है। तो कुछ और ही है।