एक बैश स्क्रिप्ट में, मैं लाइन द्वारा एक लंबी कमांड लाइन के मानक आउटपुट को कैप्चर करना चाहूंगा, ताकि उनका विश्लेषण किया जा सके और रिपोर्ट किया जा सके, जबकि प्रारंभिक कमांड अभी भी चल रहा है। यह वह जटिल तरीका है जिसकी मैं कल्पना कर सकता हूं:
# Start long command in a separated process and redirect stdout to temp file
longcommand > /tmp/tmp$$.out &
#loop until process completes
ps cax | grep longcommand > /dev/null
while [ $? -eq 0 ]
do
#capture the last lines in temp file and determine if there is new content to analyse
tail /tmp/tmp$$.out
# ...
sleep 1 s # sleep in order not to clog cpu
ps cax | grep longcommand > /dev/null
done
मैं जानना चाहूंगा कि क्या ऐसा करने का एक सरल तरीका है।
संपादित करें:
अपने प्रश्न को स्पष्ट करने के लिए, मैं इसे जोड़ूंगा। longcommand
लाइन द्वारा प्रदर्शित करता है उसकी स्थिति लाइन प्रति सेकंड एक बार। मैं longcommand
पूर्ण से पहले आउटपुट को पकड़ना चाहूंगा ।
इस तरह, मैं संभावित रूप से मार सकता हूं longcommand
यदि यह मेरे द्वारा अपेक्षित परिणाम प्रदान नहीं करता है।
मैंने कोशिश की है:
longcommand |
while IFS= read -r line
do
whatever "$line"
done
लेकिन whatever
(उदाहरण के लिए echo
) longcommand
पूरा होने के बाद ही निष्पादित होता है ।