क्या प्रक्रिया को चलाने के दौरान पाइप को संपादित करने का कोई तरीका है?


3

मैं कभी-कभी प्रक्रियाओं के साथ काम करता हूं:

  • शुरू करने के लिए धीमी गति से कर रहे हैं
  • थोड़ी देर चला
  • मानक आउट करने के लिए बहुत सारी जानकारी लॉग इन करें

उदाहरण के लिए, कल्पना करें कि यह एक बड़ा वेब अनुप्रयोग है।

अब मान लीजिए कि, एक पल के लिए, मैं केवल उन आउटपुट लाइनों को देखना चाहता हूं जिनमें सम्‍मिलित हैं foo। मैं यह कर रहा हूं:

$ heavy_process
# watch for a bit
# ah, now I just want to see lines that contain 'foo'
# (kill heavy_process)

$ heavy_process | grep foo
# watch for a bit
# ok, I'm statisfied about foo. Let's look at bar instead
# (kill heavy_process)

$ heavy_process | grep bar

heavy_processजब मैं वास्तव में सिर्फ बदलाव करना चाहता हूं तो इसे फिर से शुरू करना निराशाजनक है | grep

क्या कमांड लाइन में पाइप लाइन से "पाइप जोड़ने और हटाने" का एक तरीका है?


2
मुझे लगता है मैं कर सकता था heavy_process > some_file 2>&1, फिर अलग से tail -f some_file | grep foo,। हालांकि यह सुनिश्चित नहीं है कि रंग को संरक्षित करना कितना अच्छा होगा।
नाथन लॉन्ग

जवाबों:


1

मुझे लगता है कि कुछ नियंत्रण प्रक्रिया को टाला नहीं जा सकता। मैं विभिन्न तरीकों के बारे में सोच सकता हूं। या तो एक गतिशील पैटर्न मिलान (के बजाय grep), के मूल के साथ awk '$0 ~ pat', जहां patगतिशील रूप से लोड किया जाएगा (जैसे कि एक GNU awkसह-प्रक्रिया)। या कुछ आदिम पैटर्न इंजेक्शन समाधान, जहां परिवर्तन-पैटर्न निर्देश डेटा स्ट्रीम में डाले जाते हैं ताकि awkफ़िल्टर मक्खी की तर्ज पर पैटर्न को आसानी से समायोजित कर सके:

mkfifo cmdfifo       # create once an asynchroneous communication channel

{ while read cmd < cmdfifo ; do printf "%s\n" "@$cmd" ; done &
  heavy_process ;} |
    awk '
        /^@/ { pat = substr($0,2) ; next }   # parse the injected pattern
        pat !="" && $0 ~ pat     # if pattern is set print matching lines
    '

फिर आपके द्वारा उपयोग किए जाने वाले विशिष्ट पैटर्न के लिए खोज को सक्रिय या स्विच करना, जैसे;

echo bar > cmdfifo

"बार" के लिए एक मैच को सक्रिय करने के लिए, और बाद में

echo foo > cmdfifo

पैटर्न को "फू" में बदल देगा।


0

मेरा मानना ​​है कि आपका अपना सुझाव सबसे अच्छा समाधान है, जिस संशोधन के साथ आप पृष्ठभूमि में कमांड चलाते हैं:

heavy_process > some_file &

2>&1यदि आप heavy_processलिखने के लिए खोज करने में सक्षम होना चाहते हैं कि stderr को पाठ लिखते हैं तो जोड़ें । चूंकि आप कहते हैं कि प्रोग्राम "लॉग आउट करने के लिए बहुत सारी जानकारी लॉग इन करते हैं", मैं उपयोग नहीं करने की सलाह देता हूं 2>&1&आदेश के अंत में अतुल्यकालिक रूप से चलाने के लिए प्रक्रिया का कारण बनता है, जिसका अर्थ है कि आप के चलते समय अन्य बातों के लिए अपने टर्मिनल का उपयोग कर सकते हैं। आप किस शेल का उपयोग कर रहे हैं, इसके आधार पर, आपको संभवतः यह सूचित किया जाएगा कि यह कब समाप्त होगा।

अब तक की प्रक्रिया के आउटपुट के माध्यम से खोज करने के लिए , आप सभी की जरूरत है

grep foo some_file

अब तक आउटपुट के माध्यम से खोजने के लिए और फ़ाइल की निगरानी करना जारी रखें क्योंकि प्रक्रिया इसे लिखती है , उपयोग करें

tail -n +1 -f some_file | grep foo

बिना -n +1, tailआपको केवल फ़ाइल की अंतिम 10 लाइनें देगा।


-2

आप निम्नानुसार एक स्क्रिप्ट लिख सकते हैं:

#! /bin/bash
while true;
do
        echo -n "Enter your regexp: "
        read myregexp
        heavy_process | grep "$myregexp"
done

आप किसी भी समय Ctrl-c के साथ प्रक्रिया को बाधित कर सकते हैं


2
मुझे लगता है कि प्रश्न का बिंदु heavy_processपैटर्न के हर बदलाव के बाद इसे चालू रखना और इसे (न तो मैन्युअल रूप से और न ही स्वचालित रूप से) चालू करना था । ( हर पैटर्न में बदलाव के बाद आपका प्रस्ताव फिर से शुरू होगाheavy_process ।)
Janis

आप सही कह रहे हैं कि मैं उस बिंदु को याद कर रहा हूं, हर बार जो लूप से गुजरता है फिर से चलता है। शायद स्क्रिप्ट में सुधार किया जा सकता था।
14:21 पर सेबेल

शायद स्क्रिप्ट में सुधार किया जा सकता था। शायद जवाब में हैवी_प्रोसेस को सही जगह ले जाना शामिल होना चाहिए, और आउटपुट को थोड़ी देर के लूप में रखने का तरीका खोजना चाहिए।
sebelk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.