टाइमआउट, ब्रेकिंग पाइप और डब्ल्यूसी


20

मुझे कुछ डिकंप्रेसन कार्यक्रमों को जल्दी से बेंचमार्क करने का विचार था। उदाहरण के लिए, मैं कमांड चलाऊंगा:

timeout 10 zcat foo.gz | wc -c

जो डेटा की मात्रा को मापता है वह डिकंप्रेसर 10 सेकंड में निकाल सकता है।

एकमात्र समस्या यह है, कि यह काम नहीं करता है: जैसे कि zcat को मार दिया जाता है, wc को भी मार दिया जाता है, इसलिए मुझे बाइट की गिनती नहीं मिलती है, बस एक Terminatedसंदेश।

तो, सवाल यह है: क्या कोई तरीका है कि wc से गिनती प्राप्त की जाए , या तो सिग्नल को किसी तरह से ब्लॉक किया जाए, या wc के बजाय एक विकल्प का उपयोग किया जाए, जो कि एक परिणाम को तब संकेत देता है जब उसे एक टर्म सिग्नल मिलता है।


बेशक, वहाँ विकल्प हैं:

  1. एक अस्थायी फ़ाइल पर लिखना:
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x इसके साथ समस्या यह है कि बहुत अधिक मेमोरी का उपयोग होता है, और कुछ प्रदर्शन जुर्माना भी हो सकता है।

  2. इसके बजाय ulimit का उपयोग करना:
    ulimit -t 10; zcat foo.gz | wc -c
    यह भी काम करता है, लेकिन केवल cpu समय को मापता है, इसलिए I / O के कारण मंदी (जैसे कि संपीड़न अधिक खराब है, और डिस्क से अधिक बाइट्स पढ़ने की आवश्यकता है) को मापा नहीं जाता है।

  3. छोटी परीक्षण फ़ाइलें बनाना:
    ठीक है, यह निश्चित रूप से काम कर सकता है, और सबसे अच्छा समाधान हो सकता है। हालाँकि, यह बहुत अधिक अस्थायी फ़ाइलें बनाता है।


6
जैसा कि मैंने "ब्रेकिंग पाइप और डब्ल्यूसी" पढ़ा, मैंने सोचा कि पहले आपको अपने प्लंबिंग की समस्या हो रही थी!
dr01

जवाबों:


21

आप टाइमआउट कमांड को एक सबशेल में रख सकते हैं और इसे सफल बना सकते हैं:

( timeout 10 <command> || true ) | wc -c

3
एक असफल कमांड को सफल बनाना? ओह, यह बहुत बुरा लग रहा है: डी
एराथियल

17
@ इरातिल वाना बुराई करते हुए मुस्कुराते हैं? इस एक की कोशिश करो (यह ऊपर के बराबर है):(timeout 10 <command> || :) | wc -c
मार्को

1
मैंने एक सबशेल का उपयोग करने की कोशिश की, लेकिन इसे सफल बनाने के बारे में नहीं सोचा। अति उत्कृष्ट!
पी। सेपर

2

पोस्ट करने के तुरंत बाद, मुझे इस प्रक्रिया के लिए नामित पाइप का उपयोग करने का विचार था:

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

यह काम करने लगता है।

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