स्ट्रीडर को पुनर्निर्देशित करने के बाद बैश स्क्रिप्ट का आउटपुट पाइप करना [बंद]


9

जिस तरह से मेरा होस्टर चीजों को करता है, मुझे सेवाओं के लिए एक प्रणाली का उपयोग करना पड़ता है।

इस सेवा में एक रन फ़ाइल होती है जिसे यह एक दूसरे रन फ़ाइल में निष्पादित और पाइप करता है। लेकिन मैं एक (दिए गए) अजगर पैकेज का उपयोग करता हूं जो 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 पर है)। मुझे अपने पुनर्निर्देशन को काम करने के लिए कैसे संशोधित करना होगा?


5
exec ... 2>&1वास्तव में मानक त्रुटि को मानक आउट में शामिल करता है। तो कुछ और ही है।
त्रिगुट

3
किसी भी मौका अजगर स्क्रिप्ट stderr बंद कर रहा है और इसे एक फ़ाइल के रूप में फिर से खोल रहा है? dup2()कोड में कॉल देखें । किसी भी विचार जहां stderr उत्पादन किया जाता है जा रहे हैं? एक और विचार: शायद आपके होस्ट की रन फ़ाइल आपके कोड को शुरू करने से पहले इस तरह से पुनर्निर्देशित कर रही है।
एडवर्ड फाल

1
क्या आप इस बात की पूरी तरह पुष्टि कर सकते हैं कि पाठ को stderr पर भेजा जा रहा है? स्क्रिप्ट को एक के साथ बदलें जो import sys; print("Hello, stderr", file=sys.stderr)निश्चित हो।
रसूव

3
वास्तव में stderr? यह कोशिश करो exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logऔर इस logfiles में एक नज़र रखना।
इंगोपिंगो

2
यदि आप श के बजाय बैश का उपयोग करते हैं तो क्या होगा?
लुसियानो अंड्रेस मार्टिनी

जवाबों:


0

प्रयास करें:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

यानी: exec 2>&1एक अलग लाइन पर, एक ही चीज को रीडायरेक्ट करने के लिए stdout को कहा जा रहा है (आपका पैरामीटर? या मेल अगर crontab में है?), इसके बाद cd & exec पर मौजूदा प्रक्रिया को pythit3.2 के साथ बदलने के लिए। ध्यान दें कि मैंने कम पोर्टेबिलिटी के लिए श के बजाय बैश पर स्विच किया, लेकिन आमतौर पर बहुत बेहतर विश्वसनीयता। यदि यह काम करता है, तो महान, यदि कुछ बेहतर जानकार व्यक्ति इसमें कदम नहीं रखेंगे। (मेरे पास अभी इस पर शोध करने का समय नहीं है)

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