Làm cách nào để thoát chế độ `tail -f` mà không cần sử dụng` Ctrl + c`?


22

Khi tôi làm tail -f filename, làm thế nào để thoát khỏi chế độ mà không sử dụng Ctrl+cđể giết quá trình?

Những gì tôi muốn là một cách bình thường để bỏ, như qtrong top.

Tôi chỉ tò mò về câu hỏi, bởi vì tôi cảm thấy rằng giết quá trình không phải là một cách tốt để bỏ một cái gì đó.


23
tailkhông tương tác; nó không nhận lệnh.
muru

5
Cũng có sự khác biệt giữa quá trình tiêu diệt với SIGTERM (mặc định) và SIGKILL. SIGTERM 'yêu cầu quá trình dừng lại và tín hiệu này có thể được xử lý bởi chương trình. Mặt khác, SIGKILL thực sự giết chết quá trình. Xem man signalđể biết thêm
mrc02_kr

9
Tiền đề của câu hỏi này là bị lỗi. Nhân vật đặc biệt đó không "giết chết" quá trình theo cách bạn đang nghĩ. Nó gửi tín hiệu ngắt đến nó, không gửi tín hiệu tiêu diệt hoặc kết thúc .
JdeBP

6
Hoàn toàn hợp lý để làm gián đoạn tailhoặc thậm chí giết nó mà không phải lo lắng. Nhưng nếu bạn muốn một giải pháp thay thế, hãy xem xét most, trong đó có chế độ "theo dõi" được thừa nhận dưới tài liệu, được khởi xướng với Shift + F và có thể thoát khỏi hoàn toàn với Q.
Toby Speight

4
Vấn đề ở đây là nhận thức của bạn rằng "giết quá trình không phải là cách tốt để bỏ thứ gì đó" - gửi ^ C đến một quy trình một cách để nói "Tôi đã làm xong với bạn và tôi muốn bạn dừng lại", đó cách "mặc định" để thoát khỏi tiến trình đầu cuối trong Linux. Nếu bạn chọn thoát khỏi một quá trình chạy dài, hậu quả của sự lựa chọn của bạn để ngăn chặn nó có thể để lại một mớ hỗn độn, nhưng tail -fkhông phải vậy :)
Josh

Câu trả lời:


46

Như đã nói trong các bình luận, Ctrl-Ckhông giết chết tailquá trình, điều này được thực hiện bằng cách gửi tín hiệu SIGTERM hoặc SIGKILL (khét tiếng -9...); nó chỉ gửi một SIGINT mà nóitail để kết thúc chế độ chuyển tiếp và thoát.

FYI, đây là một công cụ tốt hơn:

less +F filename

Trong less, bạn có thể nhấn Ctrl-Cđể kết thúc chế độ chuyển tiếp và cuộn qua tệp, sau đó nhấnF để quay lại chế độ chuyển tiếp.

Lưu ý rằng less +Fđược nhiều người ủng hộ như là một thay thế tốt hơn đểtail -f . Để biết sự khác biệt và hãy cẩn thận giữa hai công cụ, hãy đọc câu trả lời này: `tail -f` có hiệu quả hơn` less + F` không?


7
Đề ra. OP không yêu cầu "kết thúc chế độ chuyển tiếp và cuộn qua tệp". Thay vào đó, OP đã hỏi cách thoát đuôi -f mà không cần sử dụng Ctrl + C
fpmurphy

6
@ fpmurphy1 Cho rằng tiền đề câu hỏi của OP là không chính xác ( tailkhông bị CTRL-C giết và không tương tác) Tôi tin rằng câu trả lời của tôi là phù hợp hơn.
dr01

11
@ fpmurphy1 Nếu bạn thực hiện OP theo đúng nghĩa đen thì nó không có chủ đề, tuy nhiên tôi thích các câu trả lời mang tính giáo dục giải quyết những hiểu lầm và đồng thời đưa ra câu trả lời cho những gì OP thực sự đang cố gắng đạt được, tức là câu hỏi thực sự .
MarioDS

15
"Ctrl-C không giết quá trình đuôi" - Đúng vậy. Hoặc ít nhất là nhiều như kill <pid>vậy. Đối với hầu hết các chương trình, không có sự khác biệt thực sự giữa Ctrl-C(= SIGINT) SIGTERMvà, ở một mức độ nào đó , SIGKILL. Hành động mặc định cho cả ba chỉ đơn giản là chấm dứt quá trình, như thể exit()đã được gọi, ngoại trừ SIGKILL, không có mã chế độ người dùng nào được liên kết với exit()được gọi (vì vậy không có atexit()dọn dẹp, v.v.). Ctrl-CSIGTERM, đặc biệt, hoàn toàn giống nhau trừ khi chương trình nắm bắt rõ ràng và hành động theo nó. Đuôi GNU không.
marcelm

4
@marcelm Chấm dứt quá trình không giống như exit()được gọi. exit()sẽ chạy các atexit()trình xử lý và dọn sạch các tệp stdio đang mở (quan trọng nhất là xóa bộ đệm đầu ra). Một người SIGINTxử lý có thể làm điều này, nhưng hầu hết các chương trình không làm phiền; Tôi không biết có taillàm hay không.
Barmar

14

Những gì tôi muốn là một cách bình thường để bỏ, như q trong top.

Đó là ControlC:)

Tôi chỉ tò mò về câu hỏi, bởi vì tôi cảm thấy rằng giết quá trình không phải là một cách tốt để bỏ một cái gì đó.

^C( ControlC) gửi SIGINT cho quy trình, được định nghĩa là:

Tín hiệu SIGINT được gửi đến một quy trình bởi thiết bị đầu cuối kiểm soát của nó khi người dùng muốn làm gián đoạn quá trình

Đó chính xác là những gì bạn muốn làm ở đây, bị gián đoạn tail. Không có cách nào khác để thực hiện những gì bạn đang cố gắng làm (bỏ đuôi "độc đáo") và trong khi các câu trả lời khác cung cấp một phương tiện để dừng lạitail theo những cách khác, thì chúng cũng không tốt hơn.

Nhấn ^Csẽ cố gắng làm gián đoạn một tác vụ trong Linux - điều này là hoàn toàn bình thường và nó chỉ "không tốt" nếu quá trình đó ở giữa một cái gì đó và bạn không để nó kết thúc, và sau đó là bên "không tốt" hiệu ứng là những thứ còn sót lại từ quá trình đó. Ví dụ, ^Cở giữa một makelệnh để lại phần mềm được biên dịch một phần, nhưng điều đó tốt: một bước tiếp theo makesẽ làm sạch / tiếp tục nơi nó bị tắt.


2
Trên thực tế, makeví dụ này là một lời nhắc nhở tại sao chúng ta luôn viết .DELETE_ON_ERROR:trong Makefiles của mình - chúng ta muốn Make để xóa các tệp trung gian được viết một phần khi biết rằng một trong các lệnh của nó nhận được tín hiệu.
Toby Speight

Các quy trình có thể bẫy SIGINTvà dọn dẹp trước khi thoát như trong .DELETE_ON_ERROR:ví dụ của Toby .
Tạm dừng cho đến khi có thông báo mới.

1
Vâng, khả năng bẫy SIGINT chính xác là lý do tại sao tôi nói đó là điều @Arthur muốn. Không cần phải "tử tế" để theo đuôi, bạn sẽ không làm tổn thương cảm xúc của mình với a ^C:)
Josh

12

tail -fTên tệp, làm thế nào để thoát khỏi chế độ mà không sử dụng Ctrl cđể giết quá trình

Bạn không thể làm điều đó. Có lẽ bạn muốn chạytail -f somefile | less

Điều Ctrl cnày được giải thích bởi hệ thống con tty (và bằng vỏ của bạn) và gửi SIGINTtín hiệu (xem tín hiệu (7)pty (7) ...). Xem tty làm sáng tỏ .


6

Điều này sẽ làm việc và trả lời câu hỏi của bạn, nhưng không phải là một giải pháp đặc biệt thỏa đáng.

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

Điều này sẽ chạy lệnh trong 15 giây và sau đó giết nó cho bạn, mà không cần phải nhấn ^C


5
Vâng, vì vậy sẽ tắt máy tính tailđang được chạy. Tuy nhiên, bạn đoán không sai.
Aaron

5
Làm thế nào là chấm dứt tailvới SIGTERM tốt hơn là chấm dứt nó với SIGINT?
Dmitry Grigoryev

1
@DmitryGrigoryev Bạn hoàn toàn đúng - không tốt hơn. Nhưng câu trả lời này trực tiếp trả lời câu hỏi của OP, mặc dù nó không thực sự được sử dụng nhiều trong thực tế. Tuy nhiên, tôi đã sử dụng thời gian chờ để chấm dứt những thứ như ping, khi sử dụng ứng dụng Dell DRAC Java yêu cầu lựa chọn menu để nhấn Control và lựa chọn menu thứ hai để giải phóng điều khiển (thật khó chịu, một lưỡi Dell c5220)
Criggie

0

Câu trả lời khác nhau dựa trên bối cảnh. Để thoát khỏi đuôi -f một cách thanh lịch, bạn sẽ cần một kích hoạt. Giả sử bạn đang cố gắng theo dõi đầu ra của một nhiệm vụ sẽ hoàn thành tại một thời điểm nào đó - điều đó có thể trở thành kích hoạt của bạn.

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

Tôi đã sử dụng những ý tưởng tương tự trong quá khứ.

Thưởng thức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.