मेरे पास एक कार्यक्रम है जो उपयोगी जानकारी का उत्पादन करता है, stdout
लेकिन इससे भी पढ़ता है stdin
। मैं मानक इनपुट पर कुछ भी प्रदान किए बिना इसके मानक आउटपुट को एक फ़ाइल में पुनर्निर्देशित करना चाहता हूं। अब तक, इतना अच्छा: मैं कर सकता हूँ:
program > output
और ट्टी में कुछ भी नहीं है।
हालाँकि, समस्या यह है कि मैं इसे पृष्ठभूमि में करना चाहता हूं। यदि मैं करता हूँ:
program > output &
कार्यक्रम स्थगित हो जाएगा ("निलंबित इनपुट (ट्टी इनपुट)")।
यदि मैं करता हूँ:
program < /dev/null > output &
कार्यक्रम तुरंत समाप्त हो जाता है क्योंकि यह ईओएफ तक पहुंचता है।
ऐसा लगता है कि मुझे जिस चीज की आवश्यकता है, वह उस चीज में पाइप करना program
है जो अनिश्चित समय के लिए कुछ भी नहीं करता है और नहीं पढ़ता है stdin
। निम्नलिखित दृष्टिकोण काम करते हैं:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
हालांकि, यह सब बहुत बदसूरत है। वहाँ है एक सुंदर तरीका हो सकता है, मानक यूनिक्स उपयोगिताओं का उपयोग कर, "कुछ नहीं करते, अनिश्चित काल के लिए" करने के लिए (व्याख्या करने के लिए man true
)। मैं इसे कैसे हासिल कर सकता हूं? (यहाँ लालित्य के लिए मेरा मुख्य मानदंड: कोई अस्थायी फ़ाइलें नहीं; कोई व्यस्त-प्रतीक्षा या आवधिक वेकअप नहीं; संभव के रूप में कोई विदेशी उपयोगिताओं;)।
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
इसके साथ स्टड बंद करते हैं तो यह आपके कार्यक्रम से बाहर निकल जाएगा?
su -c 'program | output &' user
। मैं "सेवा / डेमॉन" को संभालने के लिए स्वीकार्य विधि के रूप में पृष्ठभूमि की नौकरियों के निर्माण के साथ एक समान प्रश्न पूछने वाला हूं। मैंने यह भी देखा कि मैं पुनर्निर्देशितSTDERR
किए बिना भी पुनर्निर्देशित नहीं कर सकता थाSTDOUT
। समाधान जहां प्रोग्रामए प्रोग्रामबी को भेजताSTDOUT
हैSTDIN
, फिरSTDERR
लॉग फ़ाइल में रीडायरेक्ट करता है:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null