कम में कम व्यवधान


13

मैं अक्सर प्रोग्राम आउटपुट को कम, उदाहरण के लिए पाइप करता हूं

produce_output | less

यह बहुत अच्छा काम करता है, जब तक कि produce_outputबड़ी मात्रा में उत्पादन नहीं होता है। यदि मैं कुछ पाठ की खोज करता हूं जो फ़ाइल में गहरा हो, तो कम रिपोर्ट

Calculating line numbers... (interrupt to abort)

यदि मैं कंट्रोल + सी के साथ बाधित करता हूं, तो यह भी मारता है produce_output, जो इसे आगे के आउटपुट का उत्पादन करने से रोकता है। क्या बाधा को कम करने के लिए भेजने का कोई तरीका है, ताकि वह produce_outputचालू रहे?

मुझे पता है कि मैं उपयोग कर सकता था kill -INT less_process, लेकिन मुझे लगता है कि एक बेहतर समाधान होना चाहिए।

जवाबों:


15

आम तौर पर पाइपलाइन में सभी प्रक्रियाएं एक ही प्रक्रिया समूह में चलती हैं , जिससे सभी सिग्नल प्राप्त करते हैं। आप एक अलग pgrp में setsid foo | lessचलाने के लिए उपयोग कर सकते हैं foo


यह ओपी द्वारा उठाए गए समस्या का प्रकाश है ऐसा लगता है कि सीटीआर + सी का उपयोग करने का निर्णय कम बाधित करने के तरीके के रूप में बहुत दुर्भाग्यपूर्ण है। क्या आप जानते हैं कि यह विशिष्ट संकेत क्यों चुना गया था? क्या कुछ अन्य संकेत कम समस्याग्रस्त होंगे?
पिओटर डोब्रोगोस्ट

@PiotrDobrogost: आप अन्य क्या संकेत देंगे? कई ऐसे कीबोर्ड शॉर्टकट नहीं हैं, जिनमें केवल SIGINT (Ctrl-C) और SIGQUIT (Ctrl- \) हैं, और उत्तरार्द्ध का अर्थ प्रोग्राम से तुरंत बाहर निकलना है, न कि केवल बीच में। बाकी के माध्यम से ही उपलब्ध हैं kill
user1686

ऐसा लगता है कि समस्या कम बाधित करने के लिए सिग्नल का उपयोग करने के कारण होती है। इसके बजाय, अगर यह कुछ सामान्य कुंजी / शॉर्टकट थे, तो हमें पहली जगह में समस्या नहीं होगी। हालांकि मुझे लगता है कि सिग्नल की आवश्यकता इस तथ्य से आती है कि प्रक्रिया selectएक ही समय में फ़ाइल / पाइप और टर्मिनल दोनों से इनपुट की प्रतीक्षा करने के लिए उपयोग नहीं कर सकती है ।
पायोत्र डोब्रोगोस्ट

@PiotrDobrogost: यह है कि, कैसे F(पालन) मोड काम करता है। पाइप और ट्टी उसी तरह प्रदूषित हैं।
user1686

आपको ऐसा क्यों लगता है कि तरीका काम करता है? मुझे लगता है कि घटनाओं का प्रवाह यह है कि शेल CTRL + C प्राप्त करता है और SIGINT सिग्नल को कम भेजता है जो कीबोर्ड / टर्मिनल को सुने बिना इस सिग्नल को अतुल्यकालिक रूप से प्राप्त करता है।
पायोत्र डोब्रोगोस्ट 15

9

आप के साथ लाइन नंबर को अक्षम कर सकते हैं

   -n or --line-numbers

विकल्प।

produce_output | less -n

-1: ओपी की भड़काने वाली समस्या को हल कर सकता है, लेकिन ओपी के वास्तविक प्रश्न (यानी, एक प्रक्रिया में बाधा डालने) का जवाब देने के लिए कुछ भी नहीं करता है।
GoldPseudo

2
क्षमा करें, लेकिन एक ऐसी सुविधा के साथ कम शुरू करना जो वांछित नहीं है और फिर एक सुविधा को अक्षम करने के लिए एक संकेत भेजने की कोशिश करें जिसे आप स्विच के साथ अक्षम कर सकते हैं एक समाधान है और समाधान नहीं है। बेशक @grawity का समाधान अच्छा है (और मैंने इसे वोट दिया) लेकिन चलो: दूसरे समूह में पहली प्रक्रिया शुरू करना जो किसी कार्य को बाधित करने के लिए सिग्नल भेजने में सक्षम हो (लाइन काउंटिंग) जिसकी आवश्यकता नहीं है वह वास्तव में बहुत कम है ज्यादा काम।
माटेओ

1
यह मेरे सवाल में पेश की गई समस्या का एक उचित समाधान है। हालाँकि, इंटरप्रिट्स केवल कम गिनती में लाइन से अधिक रोकते हैं - उदाहरण के लिए, वे एक लंबी खोज को भी बाधित करेंगे। तो, @ ग्रेविटी के समाधान को प्राथमिकता दी जाती है, क्योंकि यह कम में इंटरप्ट के किसी भी उपयोग को कवर करेगा। इस सवाल में अधिक स्पष्ट रूप से संबोधित नहीं करने के लिए मेरी बुरी!
एड मैकमैन

@EdMcMan यकीन है कि मैं भी गुरुत्वाकर्षण के समाधान के लिए तैयार हूं और मुझे कुछ नया सीखने में खुशी है जो हमेशा उपयोगी हो सकता है।
माटेओ

0

बड़ी मात्रा में आउटपुट के साथ काम करने में, मैंने आउटपुट को फ़ाइल में भेजने और देखने tail -fया less +Fदेखने के लिए बहुत उपयोगी पाया है , जैसे:

produce_output > out 2>&1 & less +F out

2>&1वाक्य रचना सुनिश्चित करें कि दोनों stdout और करने के लिए stderr जाने बनाता है out--- निकालें कि यदि आप केवल चाहते हैं stdout फाइल करने के लिए जा रहा है। इस तरह, आप आउटपुट का उत्पादन करने वाले प्रोग्राम के साथ गड़बड़ किए बिना विभिन्न तरीकों से (यहां तक ​​कि एक अलग मशीन से) आउटपुट का निरीक्षण कर सकते हैं।

ध्यान दें कि 2>&1बाश-विशिष्ट (मुझे यकीन नहीं है) हो सकता है। सुनिश्चित करें कि आपके पास आउटपुट फ़ाइल के लिए पर्याप्त डिस्क स्थान है :-)


टेल आपको केवल फ़ाइल दिखाएगा, एड ने निर्दिष्ट किया कि वह कम संवादात्मक रूप से उपयोग कर रहा है (उदाहरण के लिए, उसे फ़ाइल में खोजना होगा)
Matteo

2>&1POSIX है, नंगे >&एक bashism है।
user1686

FWIW, 2> & 1 भी Windows XP, 7, 2008, आदि पर काम करता है
jftuga

@ मत्ते: हाँ, मुझे less +Fअपने उदाहरण में उपयोग करना चाहिए था ; मैंने सिर्फ अपना जवाब अपडेट किया।
jrennie

1
@ मैटेयो: लाइन काउंटिंग less +F( समस्या less +Fउत्पन्न होने के बाद से डेटा संसाधित करने के साथ ) एक ही मुद्दा नहीं है । मैंने जो उदाहरण दिया है , उसमें मूल रूप से पोस्ट की गई समस्या नहीं है: ctrl + c बाधित नहीं होगी process_output। यदि कोई 'फॉलो' कार्यक्षमता के लिए परवाह नहीं करता है produce_output > out 2>&1, तो कोई भी चला सकता है less out। इसके साथ एक समस्या produce_output | lessयह है कि अगर कोई भी पाइप टूट जाता है (जैसे गलती से 'क्यू' से टकराना less), तो produce_outputमर जाएगा (विशेष SIGPIPE हैंडलिंग के बिना)।
jrennie

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