कुछ कमांड चलाने के दौरान एक प्रक्रिया से लॉग पढ़ें


10

मेरे पास कुछ सेवा है जो फ़ाइल में लॉग का उत्पादन करती है logs.log

मेरे पास कुछ अन्य कमांड हैं जो इस सेवा के साथ बातचीत करते हैं। मान लीजिए कि यह कुछ है foo.sh

मुझे क्या चाहिए, दौड़ने के logs.logदौरान लॉग्स को काटना और बचाना है foo.sh। दूसरे शब्दों में, मुझे सेवा के लॉग के उस हिस्से की आवश्यकता है जब यह मेरे साथ इंटरैक्ट करता है foo.sh(इसलिए मुझे foo.shलॉग्स की परवाह नहीं है )।

मुझे उम्मीद है कि यह कमांड चाल करेगा, लेकिन यह फ़ाइल को पढ़ना जारी रखता है जब foo.shपहले ही समाप्त हो गया है:

> foo.sh | tail -f logs.log > foo_part.log

क्या इस ट्रिक को करने का कोई अच्छा तरीका है?

जवाबों:


12

यह आपकी पृष्ठभूमि प्रक्रियाओं को, बल्कि, पृष्ठभूमि को भेजकर सीधा किया जाता है:

foo.sh &
mypid=$!
tail -f /path/to/logs.log > /path/to/partial.log &
tailpid=$!
wait $mypid
kill -TERM $tailpid

$!कैप्चर पिछले काम का पीआईडी, पृष्ठभूमि में चलाने के लिए भेजा तो हम कर सकते waitअपनी स्क्रिप्ट पर समाप्त करने के लिए, और उसके बाद प्रक्रिया जब हम इसकी ज़रूरत नहीं है।killtail


3
बहुत बढ़िया जवाब, आज कुछ नया सीखा है
मिगुएल मोटा

7

यह संस्करण यह भी कर सकता है (मुझे लगता है):

( tail -f logs.log >foo_part.log &
foo.sh&
wait $! && kill %1 ) 

ध्यान दें कि% 1 उपप्रकार में पहली पृष्ठभूमि प्रक्रिया को हिट करेगा


व्यक्तिगत रूप से, मैं नौकरियों के रोस्टर का उपयोग करने के बजाय स्पष्ट पीआईडी ​​पर कब्जा करना पसंद करता हूं, क्योंकि तेजी से जटिल कार्यान्वयन पृष्ठभूमि में एक से अधिक कार्य डाल kill %1सकता है और गलत लक्ष्य प्राप्त कर सकता है।
डोपघोटी

1
चूँकि मैंने सबशेल कोष्ठकों का उपयोग किया था इसलिए% 1 उपधारा के अंदर पहली नौकरी को संदर्भित करेगा (लेकिन मैं सभी गोले के लिए इस बारे में निश्चित नहीं हूं)। जाहिर है कि आपका समाधान अधिक मामलों के लिए अधिक पूर्ण और कार्यात्मक है, लेकिन मुझे लगता है कि यह वही कर सकता है जो उपयोगकर्ता को चाहिए .... एक और समस्या यह है कि मेरे संस्करण को कम से कम foo_part.log के निर्माण की आवश्यकता है स्पर्श के साथ, आपका संस्करण नहीं है।
लुसियानो एंड्रेस मार्टिनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.