`Ctrl + c` का उपयोग किए बिना` टेल -f` मोड कैसे छोड़ें?


22

जब मैं करता हूं tail -f filename, Ctrl+cतो प्रक्रिया को मारने के लिए उपयोग के बिना मोड को कैसे छोड़ना है?

मैं जो चाहता हूं, वह सामान्य तरीके से छोड़ना है, जैसे qकि top

मैं सिर्फ सवाल के बारे में उत्सुक हूं, क्योंकि मुझे लगता है कि प्रक्रिया को मारना कुछ छोड़ने का अच्छा तरीका नहीं है।


23
tailसंवादात्मक नहीं है; यह आज्ञा नहीं लेता है।
मुरू

5
SIGTERM (डिफ़ॉल्ट) और SIGKILL के साथ हत्या की प्रक्रिया में भी अंतर है। SIGTERM 'प्रोसेस' को रोकने के लिए कहता है, और इस सिग्नल को प्रोग्राम द्वारा हैंडल किया जा सकता है। दूसरी ओर SIGKILL वास्तव में इस प्रक्रिया को मारता है। man signalअधिक देखें
mrc02_kr

9
इस प्रश्न का आधार दोषपूर्ण है। वह विशेष चरित्र उस प्रक्रिया को "मार" नहीं करता है जिस तरह से आप सोच रहे हैं। यह इसके लिए रुकावट संकेत भेजता है, न कि मारने या संकेतों को समाप्त करता है।
JdeBP

6
यह पूरी तरह से बाधित है tailया यहां तक ​​कि बिना चिंता के इसे मार सकता है। लेकिन अगर आप एक विकल्प चाहते हैं, तो विचार करें most, जिसमें शिफ्ट + एफ के साथ शुरू किया गया एक कोडी-डॉक्यूमेंटेड "फॉलो" मोड है, और Q. के साथ सफाई से बाहर निकाला जा सकता है।
टॉबी स्पीट

4
यहाँ समस्या आपकी धारणा है कि "प्रक्रिया को मारना कुछ छोड़ने का अच्छा तरीका नहीं है" - प्रक्रिया को ^ C भेजना यह कहने का एक तरीका है "मैं आपके साथ हूं और मैं आपको रोकना चाहूंगा", यह है लिनक्स में एक टर्मिनल प्रक्रिया से बाहर निकलने के लिए "डिफ़ॉल्ट" जिस तरह से। यदि आप कुछ लंबी चलने वाली प्रक्रिया से बाहर निकलने का विकल्प चुन रहे हैं, तो इसे रोकने के लिए आपकी पसंद के नतीजों में गड़बड़ी हो सकती है, लेकिन tail -fयह नहीं है :)
जोश

जवाबों:


46

जैसा कि टिप्पणियों में कहा गया है, Ctrl-Cइस tailप्रक्रिया को नहीं मारता है, जो कि किसी SIGTERM या SIGKILL सिग्नल (कुख्यात -9...) को भेजकर किया जाता है ; यह केवल एक संकेत भेजता है जो tailआगे मोड को समाप्त करने और बाहर निकलने के लिए कहता है।

FYI करें, ये एक बेहतर उपकरण है:

less +F filename

में less, आप Ctrl-Cआगे मोड को समाप्त करने के लिए दबा सकते हैं और फ़ाइल के माध्यम से स्क्रॉल कर सकते हैं , फिर फिर Fसे आगे मोड में वापस जाने के लिए दबाएं ।

ध्यान दें कि less +Fएक बेहतर विकल्प के रूप में कई द्वारा वकालत की जाती हैtail -f । दो उपकरणों के बीच अंतर और गुहिकायन के लिए , इस उत्तर को पढ़ें: क्या `टेल-एफ`` कम + एफ` से अधिक कुशल है?


7
विषय से परे। ओपी ने "फॉरवर्ड मोड को समाप्त करने और फ़ाइल के माध्यम से स्क्रॉल करने के लिए नहीं कहा"। बल्कि, ओपी ने पूछा कि Ctrl + C
fpmurphy

6
@ fpmurphy1 यह देखते हुए कि ओपी का प्रश्न गलत है ( tailCTRL-C द्वारा नहीं मारा गया है और संवादात्मक नहीं है) मेरा मानना ​​है कि मेरा उत्तर उचित से अधिक है।
dr01

11
@ fpmurphy1 यदि आप ओपी का शाब्दिक अर्थ लेते हैं तो यह ऑफ-टॉपिक है, हालांकि मैं उन शैक्षिक उत्तरों को पसंद करता हूं जो गलतफहमी को दूर करते हैं और साथ ही यह भी जवाब देते हैं कि ओपी वास्तव में क्या हासिल करने की कोशिश कर रहा था , यानी असली सवाल।
मारियोड्स

15
"Ctrl-C पूंछ प्रक्रिया को नहीं मारता है" - हां यह करता है। या कम से कम जितना kill <pid>होता है। अधिकांश कार्यक्रमों के लिए, Ctrl-C(= SIGINT), SIGTERMऔर, कुछ हद तक, के बीच कोई वास्तविक अंतर नहीं है SIGKILL। सभी तीनों के लिए डिफ़ॉल्ट कार्रवाई बस प्रक्रिया को समाप्त करना है, जैसे कि exit()बुलाया गया था, अपवाद के लिए SIGKILL, जिसके साथ जुड़े उपयोगकर्ता-मोड कोड में से exit()कोई भी नहीं कहा जाता है (इसलिए कोई atexit()सफाई आदि नहीं)। Ctrl-Cऔर SIGTERM, विशेष रूप से, पूरी तरह से समान हैं जब तक कि कार्यक्रम स्पष्ट रूप से या तो पकड़ता है और उस पर कार्य करता है। GNU पूंछ नहीं है।
12

4
@marcelm प्रक्रिया को समाप्त करना वैसा ही नहीं है जैसा exit()कि कहा जा रहा है। हैंडलर exit()चलाएंगे atexit(), और खुली स्टडियो फाइलें (सबसे महत्वपूर्ण रूप से फ्लशिंग आउटपुट बफ़र्स) को साफ करेंगे । एक SIGINTहैंडलर ऐसा कर सकता है, लेकिन अधिकांश कार्यक्रम परेशान नहीं करते हैं; मुझे नहीं पता कि क्या tailकरता है।
बमर

14

मैं जो चाहता हूं वह सामान्य तरीका है, जैसे शीर्ष में क्यू।

वह ControlC:)

मैं सिर्फ सवाल के बारे में उत्सुक हूं, क्योंकि मुझे लगता है कि प्रक्रिया को मारना कुछ छोड़ने का अच्छा तरीका नहीं है।

^C( ControlC) प्रक्रिया के लिए एक संकेत भेजता है , जिसे इस रूप में परिभाषित किया गया है:

उपयोगकर्ता द्वारा प्रक्रिया को बाधित करने की इच्छा होने पर SIGINT सिग्नल को उसके नियंत्रण टर्मिनल द्वारा एक प्रक्रिया में भेजा जाता है

ठीक यही आप यहाँ करना चाहते हैं, बीच में है tail। आप जो करने की कोशिश कर रहे हैं उसे पूरा करने का कोई दूसरा तरीका नहीं है ("अच्छी तरह से" पूंछ छोड़ दें) और जबकि अन्य उत्तर tailअन्य तरीकों से रोकने का साधन प्रदान करते हैं, वे बेहतर नहीं हैं।

दबाने ^Cसे लिनक्स में किसी कार्य को बाधित करने का प्रयास किया जाएगा - यह पूरी तरह से सामान्य है, और यह केवल "अच्छा नहीं" है यदि यह प्रक्रिया किसी चीज़ के बीच में है और आप इसे खत्म नहीं होने दे रहे हैं, और फिर एकमात्र "अच्छा नहीं" पक्ष प्रभाव उस प्रक्रिया से बचे हुए चीजें हैं। एक उदाहरण के रूप ^Cमें , एक makeकमांड के बीच में आंशिक रूप से संकलित सॉफ़्टवेयर को छोड़ देता है, लेकिन यह ठीक है: आगे का रन makeक्लीन अप / रिज्यूमे को क्लीन करेगा जहां इसे छोड़ा गया था।


2
दरअसल, makeउदाहरण एक अनुस्मारक है कि हम हमेशा .DELETE_ON_ERROR:अपने मेकफाइल्स में क्यों लिखते हैं - हम चाहते हैं कि मेक आंशिक रूप से लिखित इंटरमीडिएट फ़ाइलों को हटा दें जब यह पता चलता है कि इसके आदेशों में से एक को संकेत मिला।
टोबी स्पाइट

SIGINTटोबी के .DELETE_ON_ERROR:उदाहरण में संकेत दिए जाने से पहले प्रक्रियाएं फंस सकती हैं और सफाई कर सकती हैं ।
अगली सूचना तक रोक दिया गया।

1
हां, SIGINT को फंसाने की क्षमता ठीक वैसी ही है जैसा मैंने कहा कि यह @Aththur चाहता है। पूंछ करने के लिए "अच्छा" होने की कोई आवश्यकता नहीं है, आप भावनाओं को चोट नहीं ^C
जोश

12

tail -fफ़ाइल नाम, Ctrl cप्रक्रिया को मारने के लिए उपयोग के बिना मोड को कैसे छोड़ना है

आप ऐसा नहीं कर सकते। शायद आप दौड़ना चाहते थेtail -f somefile | less

Ctrl c(और अपने खोल से) tty सबसिस्टम द्वारा व्याख्या की है और एक भेजता SIGINTसंकेत (देखें संकेत (7) और प्राइवेट (7) ...)। टटी को ध्वस्त देखें ।


6

यह काम करेगा और आपके प्रश्न का उत्तर देगा, लेकिन विशेष रूप से संतोषजनक समाधान नहीं है।

timeout 15s tail -f /var/log/messages

यह 15 सेकंड के लिए कमांड चलाएगा और फिर इसे आपके लिए मार देगा, बिना प्रेस किए ^C


5
हाँ, इसलिए कंप्यूटर को बंद किया tailजा रहा है। फिर भी, आप गलत नहीं हैं मुझे लगता है।
हारून

5
tailSIGINTM के साथ इसे समाप्त करने की तुलना में SIGTERM के साथ समापन कैसे बेहतर है?
दिमित्री ग्रिगोरीव

1
@DmitryGrigoryev आप पूरी तरह से सही हैं - यह बेहतर नहीं है। लेकिन यह जवाब सीधे ओपी के सवाल का जवाब देता है, भले ही यह वास्तव में वास्तविकता में बहुत अधिक उपयोग न हो। हालाँकि, मैंने पिंग जैसी चीज़ों को समाप्त करने के लिए टाइमआउट का उपयोग किया है, जब डेल डीआरएसी जावा ऐप का उपयोग किया जाता है, जिसे नियंत्रण के लिए एक मेनू चयन और नियंत्रण जारी करने के लिए एक दूसरी मेनू पसंद की आवश्यकता होती है (वह सिर्फ चिढ़, डेल c5220 ब्लेड)
Crigieie

0

संदर्भ के आधार पर उत्तर अलग-अलग होते हैं। टेल-एफ को धीरे से छोड़ने के लिए , आपको ट्रिगर की आवश्यकता होगी। मान लें कि आप किसी कार्य के आउटपुट की निगरानी करने की कोशिश कर रहे हैं जो किसी समय में समाप्त हो जाएगा - जो आपका ट्रिगर बन सकता है।

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

मैंने पूर्व में भी इसी तरह के विचारों का इस्तेमाल किया है।

का आनंद लें।

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