Bagaimana cara keluar dari mode `tail -f` tanpa menggunakan` Ctrl + c`?

22

Ketika saya melakukannya tail -f filename, bagaimana cara keluar dari mode tanpa menggunakan Ctrl+cuntuk mematikan proses?

Apa yang saya inginkan adalah cara normal untuk berhenti, seperti qdi top.

Saya hanya ingin tahu tentang pertanyaan itu, karena saya merasa bahwa membunuh proses itu bukanlah cara yang baik untuk berhenti.

Key Shang
sumber
23
tailtidak interaktif; tidak menerima perintah.
muru
5
Ada juga perbedaan antara proses pembunuhan dengan SIGTERM (default) dan SIGKILL. SIGTERM 'meminta' proses untuk berhenti, dan sinyal ini dapat ditangani oleh program. Di sisi lain SIGKILL benar-benar membunuh prosesnya. Lihat man signallebih lanjut
mrc02_kr
9
Premis dari pertanyaan ini salah. Karakter khusus itu tidak "membunuh" proses dengan cara yang Anda pikirkan. Ini mengirimkan sinyal interupsi , bukan sinyal membunuh atau mengakhiri .
JdeBP
6
Sangat masuk akal untuk menyela tailatau bahkan membunuhnya tanpa khawatir. Tetapi jika Anda menginginkan alternatif, pertimbangkan most, yang memiliki mode "ikuti" yang secara resmi didokumentasikan, dimulai dengan Shift + F, dan dapat keluar dengan bersih dengan Q.
Toby Speight
4
Masalahnya di sini adalah persepsi Anda bahwa "membunuh proses itu bukan cara yang baik untuk berhenti dari sesuatu" - mengirim ^ C ke suatu proses adalah salah satu cara untuk mengatakan "Saya sudah selesai dengan Anda dan saya ingin Anda berhenti", ini adalah cara "default" untuk keluar dari proses terminal di Linux. Jika Anda memilih untuk keluar dari proses yang sudah berjalan lama, dampak dari pilihan Anda untuk menghentikannya mungkin meninggalkan kekacauan, tetapi tail -fbukankah itu :)
Josh

Jawaban:

46

Seperti yang dikatakan dalam komentar, Ctrl-Ctidak mematikan tailproses, yang dilakukan dengan mengirimkan sinyal SIGTERM atau SIGKILL (yang terkenal -9...); itu hanya mengirim SIGINT yang memberitahu tailuntuk mengakhiri mode maju dan keluar.

FYI, ini alat yang lebih baik:

less +F filename

Di less, Anda dapat menekan Ctrl-Cuntuk mengakhiri mode maju dan menggulir seluruh file, lalu tekan Funtuk kembali ke mode maju lagi.

Catatan yang less +Fdianjurkan oleh banyak orang sebagai alternatif yang lebih baiktail -f . Untuk perbedaan dan peringatan antara kedua alat, baca jawaban ini: Apakah `tail -f` lebih efisien daripada` less + F`?

dr01
sumber
7
Menyimpang dari topik. OP tidak meminta untuk "mengakhiri mode maju dan menggulir file". Sebaliknya, OP bertanya bagaimana cara keluar dari tail -f tanpa menggunakan Ctrl + C
fpmurphy
6
@ fpmurphy1 Mengingat bahwa premis pertanyaan OP salah ( tailtidak terbunuh oleh CTRL-C dan tidak interaktif) Saya yakin jawaban saya lebih dari cukup.
dr01
11
@ fpmurphy1 Jika Anda menggunakan OP secara harfiah ya itu di luar topik, namun saya lebih suka jawaban pendidikan yang mengatasi kesalahpahaman dan pada saat yang sama memberikan jawaban untuk apa yang sebenarnya ingin dicapai oleh OP , yaitu pertanyaan sebenarnya .
MarioDS
15
"Ctrl-C tidak membunuh proses ekor" - Ya itu. Atau setidaknya sebanyak kill <pid>itu. Untuk sebagian besar program, tidak ada perbedaan nyata antara Ctrl-C(= SIGINT), SIGTERMdan, sampai batas tertentu SIGKILL,. Tindakan default untuk ketiganya adalah menghentikan proses, seolah-olah exit()telah dipanggil, dengan pengecualian bahwa untuk SIGKILL, tidak ada kode mode pengguna yang terkait dengan exit()yang dipanggil (jadi tidak ada atexit()pembersihan, dll.). Ctrl-Cdan SIGTERM, khususnya, benar-benar identik kecuali jika program secara eksplisit menangkap keduanya dan menindaklanjutinya. Ekor GNU tidak.
marcelm
4
@marcelm Mengakhiri prosesnya tidak sama dengan exit()dipanggil. exit()akan menjalankan atexit()penangan, dan membersihkan file stdio yang terbuka (yang terpenting adalah buffer output pembilasan). Seorang SIGINTpawang bisa melakukan ini, tetapi sebagian besar program tidak mengganggu; Saya tidak tahu apakah tailbenar.
Barmar
14

Yang saya inginkan adalah cara normal untuk berhenti, seperti q di atas.

Itu ControlC:)

Saya hanya ingin tahu tentang pertanyaan itu, karena saya merasa bahwa membunuh proses itu bukanlah cara yang baik untuk berhenti.

^C( ControlC) mengirimkan SIGINT ke proses, yang didefinisikan sebagai:

Sinyal SIGINT dikirim ke suatu proses oleh terminal pengontrolnya ketika seorang pengguna ingin menghentikan proses tersebut

Itulah yang ingin Anda lakukan di sini, menyela tail. Tidak ada cara lain untuk mencapai apa yang Anda coba lakukan ("baik" berhenti membuntuti) dan sementara jawaban lain menyediakan cara untuk berhenti taildengan cara lain, mereka tidak lebih baik.

Menekan ^Cakan berusaha mengganggu tugas di Linux - ini normal, dan itu hanya "tidak baik" jika proses itu di tengah-tengah sesuatu dan Anda tidak membiarkannya selesai, dan kemudian satu-satunya sisi "tidak baik" Efeknya adalah sisa hal-hal dari proses itu. Sebagai contoh, ^Cdi tengah-tengah makeperintah meninggalkan sebagian perangkat lunak yang dikompilasi, tetapi tidak apa-apa: menjalankan lebih lanjut makeakan membersihkan bahwa / melanjutkan di mana ia tinggalkan.

Josh
sumber
2
Sebenarnya, makecontohnya adalah pengingat mengapa kita selalu menulis .DELETE_ON_ERROR:di Makefiles kita - kita ingin Make untuk menghapus file-file antara yang ditulis sebagian ketika mengetahui bahwa salah satu perintahnya menerima sinyal.
Toby Speight
Proses dapat menjebak SIGINTdan melakukan pembersihan sebelum keluar seperti yang ditunjukkan dalam .DELETE_ON_ERROR:contoh Toby .
Dijeda sampai pemberitahuan lebih lanjut.
1
Ya, kemampuan untuk menjebak SIGINT adalah alasan saya mengatakan itulah yang diinginkan @Arthur. Tidak perlu menjadi "baik" untuk dibuntuti, Anda tidak akan melukai perasaan itu dengan ^C:)
Josh
12

tail -fnama file, cara keluar dari mode tanpa menggunakan Ctrl cuntuk mematikan proses

Kamu tidak bisa melakukan itu Mungkin Anda ingin laritail -f somefile | less

Ini Ctrl cditafsirkan oleh subsistem tty (dan oleh shell Anda) dan mengirimkan SIGINTsinyal (lihat sinyal (7) dan pty (7) ...). Lihat tty demystified .

Basile Starynkevitch
sumber
6

Ini akan bekerja dan menjawab pertanyaan Anda, tetapi bukan solusi yang sangat memuaskan.

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

Ini akan menjalankan perintah selama 15 detik dan kemudian membunuhnya untuk Anda, tanpa harus menekan ^C

Criggie
sumber
5
Ya, jadi mematikan komputer tailsedang berjalan. Tetap saja, Anda tidak salah kurasa.
Aaron
5
Bagaimana mengakhiri taildengan SIGTERM lebih baik daripada mengakhiri dengan SIGINT?
Dmitry Grigoryev
1
@DmitryGrigoryev Anda sepenuhnya benar - itu tidak lebih baik. Tetapi jawaban ini langsung menjawab pertanyaan OP, meskipun sebenarnya tidak banyak digunakan dalam kenyataan. Namun saya telah menggunakan batas waktu untuk mengakhiri hal-hal seperti ping, ketika menggunakan aplikasi Dell DRAC Java yang membutuhkan pilihan menu untuk menekan Control dan pilihan menu kedua untuk melepaskan kontrol (yang hanya menjengkelkan, blade Dell c5220)
Criggie
0

Jawaban berbeda berdasarkan konteks. Untuk keluar dari ekor dengan anggun, Anda perlu pemicu. Asumsikan Anda mencoba untuk memantau output dari tugas yang akan selesai pada suatu waktu - yang dapat menjadi pemicu Anda.

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

Saya telah menggunakan ide-ide serupa di masa lalu.

Nikmati.

navjit.brar
sumber