วิธีออกจากโหมด `tail -f` โดยไม่ใช้` Ctrl + c`?


22

เมื่อฉันtail -f filenameจะออกจากโหมดโดยไม่ใช้Ctrl+cเพื่อฆ่ากระบวนการได้อย่างไร

สิ่งที่ฉันต้องการเป็นวิธีปกติที่จะเลิกชอบในqtop

ฉันแค่อยากรู้เกี่ยวกับคำถามเพราะฉันรู้สึกว่าการฆ่ากระบวนการไม่ใช่วิธีที่ดีในการออกจากบางสิ่ง


23
tailไม่ได้มีการโต้ตอบ มันไม่ได้ใช้คำสั่ง
muru

5
นอกจากนี้ยังมีความแตกต่างระหว่างกระบวนการฆ่าด้วย SIGTERM (ค่าเริ่มต้น) และ SIGKILL กระบวนการ SIGTERM 'ขอให้' หยุดและสัญญาณนี้สามารถจัดการได้โดยโปรแกรม ในทางกลับกัน SIGKILL จะฆ่ากระบวนการ ดูรายละเอียดman signalเพิ่มเติม
mrc02_kr

9
หลักฐานของคำถามนี้เป็นความผิดพลาด ตัวละครพิเศษนั้นไม่ได้ "ฆ่า" กระบวนการในแบบที่คุณคิด มันส่งสัญญาณขัดจังหวะมันไม่ใช่สัญญาณฆ่าหรือยุติ
JdeBP

6
มันสมบูรณ์แบบพอสมควรที่จะขัดขวางtailหรือฆ่ามันโดยไม่ต้องกังวล แต่หากคุณต้องการทางเลือกอื่นให้พิจารณาmostซึ่งมีโหมด "ติดตาม" ที่ยอมรับไม่ได้ซึ่งเริ่มต้นด้วย Shift + F และสามารถออกอย่างหมดจดด้วย Q.
Toby Speight

4
ปัญหาที่นี่คือการรับรู้ของคุณว่า "การฆ่ากระบวนการไม่ใช่วิธีที่ดีในการออกจากบางสิ่ง" - การส่ง ^ C ไปยังกระบวนการเป็นวิธีหนึ่งในการพูดว่า "ฉันเสร็จแล้วกับคุณและฉันอยากให้คุณหยุด" มันเป็นวิธี "เริ่มต้น" เพื่อออกจากกระบวนการ terminal ใน Linux หากคุณเลือกที่จะออกจากจากบางส่วนกระบวนการระยะยาวผลกระทบที่คุณเลือกที่จะหยุดมันอาจจะออกเป็นระเบียบ แต่tail -fไม่ว่า :)
Josh

คำตอบ:


46

ดังที่ได้กล่าวไว้ในความคิดเห็นที่Ctrl-Cไม่ฆ่าtailกระบวนการซึ่งจะกระทำโดยการส่งสัญญาณ SIGTERM หรือ SIGKILL (ที่น่าอับอาย-9... ); มันแค่ส่ง SIGINT ที่บอกtailให้ยุติโหมดไปข้างหน้าและออก

FYI นี่เป็นเครื่องมือที่ดีกว่า:

less +F filename

ในlessคุณสามารถกดCtrl-Cเพื่อสิ้นสุดโหมดไปข้างหน้าและเลื่อนดูไฟล์จากนั้นกดFเพื่อกลับไปที่โหมดไปข้างหน้าอีกครั้ง

ทราบว่ามีการสนับสนุนโดยมากเป็นทางเลือกที่ดีกว่าที่จะless +F tail -fสำหรับความแตกต่างและข้อแม้ระหว่างเครื่องมือทั้งสองให้อ่านคำตอบนี้: `tail -f 'มีประสิทธิภาพมากกว่า` less + F` หรือไม่


7
ปิดหัวข้อ OP ไม่ขอให้ "ยุติโหมดไปข้างหน้าและเลื่อนดูไฟล์" ค่อนข้าง OP ถามวิธีการออกจากหาง -f โดยไม่ต้องใช้ Ctrl + C
fpmurphy

6
@ fpmurphy1 ระบุว่าคำถามของ OP ไม่ถูกต้อง ( tailไม่ได้ถูกฆ่าโดย CTRL-C และไม่ใช่แบบโต้ตอบ) ฉันเชื่อว่าคำตอบของฉันนั้นเหมาะสมกว่า
dr01

11
@ fpmurphy1 ถ้าคุณใช้ OP แท้จริงใช่มันเป็นความนอกเรื่อง แต่ผมชอบคำตอบของการศึกษาที่เข้าใจผิดอยู่และในเวลาเดียวกันจะให้คำตอบกับสิ่งที่ OP คือการจริงพยายามที่จะบรรลุคือจริงคำถาม
MarioDS

15
"Ctrl-C ไม่ได้ฆ่ากระบวนการหาง" - ใช่แล้ว หรืออย่างน้อยก็มากเท่าที่kill <pid>จะทำได้ สำหรับโปรแกรมส่วนใหญ่ไม่มีความแตกต่างอย่างแท้จริงระหว่างCtrl-C(= SIGINT) SIGTERMและในระดับSIGKILLหนึ่ง การกระทำเริ่มต้นสำหรับทั้งสามคือการยุติกระบวนการราวกับว่าexit()ได้รับการเรียกยกเว้นว่าSIGKILLไม่มีการexit()เรียกรหัสโหมดผู้ใช้ที่เชื่อมโยงกับ( ยกเว้นไม่มีatexit()การสะสาง ฯลฯ ) Ctrl-CและSIGTERMโดยเฉพาะอย่างยิ่งจะเหมือนกันอย่างสมบูรณ์เว้นแต่ว่าโปรแกรมจับอย่างชัดเจนและดำเนินการกับมัน หาง GNU ไม่ได้
marcelm

4
@marcelm การยุติกระบวนการไม่เหมือนกับexit()การเรียก exit()จะเรียกใช้ตัวatexit()จัดการและทำความสะอาดไฟล์ stdio เปิด (ที่สำคัญที่สุดคือการล้างบัฟเฟอร์เอาต์พุต) SIGINTจัดการสามารถทำเช่นนี้ แต่โปรแกรมส่วนใหญ่ไม่รำคาญ; ฉันไม่รู้ว่าtailทำ
Barmar

14

สิ่งที่ฉันต้องการเป็นวิธีปกติในการเลิกเช่น q อยู่ด้านบน

นั่นคือControlC:)

ฉันแค่อยากรู้เกี่ยวกับคำถามเพราะฉันรู้สึกว่าการฆ่ากระบวนการไม่ใช่วิธีที่ดีในการออกจากบางสิ่ง

^C( ControlC) ส่งSIGINTไปยังกระบวนการซึ่งถูกกำหนดเป็น:

สัญญาณ SIGINT ถูกส่งไปยังกระบวนการโดยเทอร์มินัลการควบคุมเมื่อผู้ใช้ต้องการขัดจังหวะกระบวนการ

tailนั่นคือสิ่งที่คุณต้องการจะทำนี่คือการขัดจังหวะ ไม่มีวิธีอื่นที่จะบรรลุสิ่งที่คุณพยายามจะทำ ("อย่างดี" ออกจากหาง) และในขณะที่คำตอบอื่น ๆ ให้วิธีการหยุดtailในวิธีอื่น ๆ พวกเขาไม่ได้ดีกว่า

การกด^Cจะพยายามขัดจังหวะงานใน Linux ซึ่งเป็นเรื่องปกติอย่างสมบูรณ์และเป็นเพียง "ไม่ดี" ถ้ากระบวนการนั้นอยู่ตรงกลางของบางสิ่งและคุณไม่ปล่อยให้มันเสร็จสิ้นและจากนั้นด้านเดียว "ไม่ดี" effect เป็นสิ่งที่เหลือจากกระบวนการนั้น ตัวอย่างเช่น^Cตรงกลางของmakeคำสั่งจะทิ้งซอฟต์แวร์ที่คอมไพล์บางส่วนไว้ แต่ก็ไม่เป็นไร: การรันต่อไปmakeจะเป็นการล้างขึ้น / กลับไปทำงานต่อที่ที่ค้างไว้


2
ที่จริงแล้วmakeตัวอย่างคือเครื่องเตือนความจำว่าทำไมเราถึงเขียน.DELETE_ON_ERROR:ใน Makefiles ของเราเสมอ- เราต้องการ Make เพื่อลบไฟล์กลางที่เขียนบางส่วนเมื่อรู้ว่าคำสั่งอย่างใดอย่างหนึ่งได้รับสัญญาณ
Toby Speight

กระบวนการสามารถดักจับSIGINTและทำความสะอาดก่อนออกจากที่ระบุไว้ใน.DELETE_ON_ERROR:ตัวอย่างของ Toby
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
ใช่ความสามารถในการดักจับ SIGINT เป็นเหตุผลที่ฉันบอกว่ามันเป็นสิ่งที่ @Arthur ต้องการ ไม่มีความจำเป็นที่จะต้องมี "ความสุข" เพื่อหางเป็นคุณจะไม่ทำร้ายความรู้สึกของมันด้วย^C:)
Josh

12

tail -fชื่อไฟล์, วิธีออกจากโหมดโดยไม่ใช้Ctrl cเพื่อฆ่ากระบวนการ

คุณทำอย่างนั้นไม่ได้ บางทีคุณต้องการเรียกใช้tail -f somefile | less

ระบบCtrl cถูกตีความโดยระบบย่อย tty (และโดยเชลล์ของคุณ) และส่งSIGINTสัญญาณ (ดูสัญญาณ (7)และpty (7) ... ) ดูTTY Demystified


6

สิ่งนี้จะได้ผลและตอบคำถามของคุณ แต่ไม่ใช่วิธีที่น่าพอใจโดยเฉพาะ

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

สิ่งนี้จะเรียกใช้คำสั่งเป็นเวลา 15 วินาทีจากนั้นฆ่าให้คุณโดยไม่ต้องกด ^C


5
ใช่แล้วจะปิดเครื่องคอมพิวเตอร์ที่tailกำลังทำงานอยู่ ถึงกระนั้นคุณก็ไม่ผิดฉันเดา
แอรอน

5
การยกเลิกtailด้วย SIGTERM ดีกว่าการยกเลิกด้วย SIGINT อย่างไร
Dmitry Grigoryev

1
@DmitryGrigoryev คุณพูดถูก - ไม่ดีกว่า แต่คำตอบนี้ตอบคำถามของ OP โดยตรงแม้ว่าจะไม่ได้ใช้งานจริงมากนัก แต่ผมมีหมดเวลาที่ใช้ในการยุติสิ่งที่ชอบปิงเมื่อใช้แอป Dell DRAC Java ที่ต้องมีการเลือกเมนูกดควบคุมและเป็นทางเลือกเมนูที่สองที่จะควบคุมการปล่อย (นั่นเป็นเพียงการระคายเคืองเป็น c5220 ใบ Dell)
Criggie

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

ฉันเคยใช้แนวคิดที่คล้ายกันในอดีต

สนุก.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.