Ctrl + c` kullanmadan `tail -f` modundan nasıl çıkılır?


22

Bunu yaptığımda , süreci öldürmek için tail -f filenamekullanmadan moddan nasıl çıkılır Ctrl+c?

İstediğim gibi çıkmak için normal bir yoldur qiçinde top.

Sadece soruyu merak ediyorum, çünkü süreci öldürmenin bir şeyi bırakmak için iyi bir yol olmadığını düşünüyorum.


23
tailetkileşimli değil; komut almaz.
muru

5
SIGTERM (varsayılan) ve SIGKILL ile öldürme işlemi arasında da bir fark vardır. SIGTERM, işlemin durmasını ister ve bu sinyal program tarafından kullanılabilir. Öte yandan, SIGKILL aslında süreci öldürüyor. Daha man signalfazlasını görün
mrc02_kr

9
Bu sorunun temeli hatalı. Yani özel bir karakter yok değil sen düşünme vardır bu şekilde süreci "öldürmek". Öldürme veya sonlandırma sinyallerini değil , kesme sinyalini gönderir .
JdeBP,

6
tailEndişelenmeden onu kesmek veya hatta öldürmek mükemmel derecede mantıklı . Eğer alternatif isterseniz, düşünün mostbelgelenmiş altında bir kuşkusuz Shift + F ile başlatılan modu, "takip et" olan, ve temiz bir şekilde Q ile çıkılabilir
Toby Speight

4
Buradaki sorun, "süreci öldürmenin bir şeyi bırakmak için iyi bir yol değil" - bir işleme ^ C göndermek , "sizinle işim bitti ve durmanı istiyorum" demenin bir yoludur. o ise Linux terminal süreçten çıkmak için "varsayılan" bir yol. Uzun süren bir işlemden çıkmayı tercih ediyorsanız, durdurmak istediğiniz seçim yanıltıcıları bir karışıklık bırakabilir, ama tail -föyle değil :)
Josh,

Yanıtlar:


46

Yorumlarda belirtildiği gibi, bir SIGTERM veya SIGKILL sinyali (rezil ...) göndererek yapılan işlemi Ctrl-Cöldürmez ; yalnızca ileri modun bitmesini ve çıkmasını söyleyen bir SIGINT gönderir .tail-9tail

Bilginize, bunlar daha iyi bir araç:

less +F filename

Gelen less, sen basabilirsiniz Ctrl-C, Dosya içinde ileri modu ve kaydırma sonlandırmak için daha sonra basın Ftekrar öne moduna geri dönmek için.

Bunun less +Fbirçok kişi tarafından daha iyi bir alternatif olarak savunulduğunutail -f unutmayın . İki araç arasındaki fark ve uyarılar için bu cevabı okuyunuz: “tail -f” `less + F” dan daha mı verimli?


7
Konu dışı. OP, "ileri modunu sonlandır ve dosyaya kaydır" sormadı. Aksine, OP Ctrl + C kullanmadan kuyruktan nasıl çıkılacağını sordu
fpmurphy

6
@ fpmurphy1 OP'nin soru öncülünün yanlış olduğu düşünülürse ( tailCTRL-C tarafından öldürülmez ve etkileşimli değildir) Cevabımın daha uygun olduğuna inanıyorum.
dr01 11

11
@ fpmurphy1 Eğer OP'yi tam anlamıyla alırsanız evet konudur, ancak yanlış anlamaları gideren eğitim cevaplarını tercih ediyorum ve aynı zamanda OP'nin gerçekte ne yapmaya çalıştığına, yani asıl soruya bir cevap veriyorum .
MarioDS

15
"Ctrl-C kuyruk işlemini öldürmez" - Evet öyle. Ya da en azından olduğu kadar kill <pid>. Çoğu program için, Ctrl-C(= SIGINT) SIGTERMile bir ölçüde arasında hiçbir fark yoktur SIGKILL. Üçünün de varsayılan eylemi, exit()çağrılmış gibi, SIGKILLkullanıcı modu kodlarından hiçbirine exit()çağrılmayan (dolayısıyla atexit()temizleme vb.) Hariç olmak üzere , işlemi basitçe sonlandırmaktır . Ctrl-Cve SIGTERMözellikle, program açıkça yakalanmadığı ve üzerine etki etmediği sürece tamamen aynıdır. GNU kuyruğu değil.
marcelm

4
@ marcelm Sürecin sonlandırılması, exit()çağrılan ile aynı değildir . işleyicileri exit()çalıştıracak atexit()ve açık stdio dosyalarını temizleyecektir (en önemlisi çıktı tamponlarını temizleme). Bir SIGINTişleyici bunu yapabilir, ancak çoğu program rahatsız etmez; Yapıp yapmadığını bilmiyorum tail.
Barmar

14

İstediğim şey, en üstte q gibi, bırakmanın normal bir yolu.

Bu ControlC:)

Sadece soruyu merak ediyorum, çünkü süreci öldürmenin bir şeyi bırakmak için iyi bir yol olmadığını düşünüyorum.

^C( ControlC) aşağıdaki gibi tanımlanmış olan sürece bir SIGINT gönderir :

SIGINT sinyali, bir kullanıcı işlemi kesmek istediğinde, kontrol terminali tarafından bir işleme gönderilir.

Bu tam olarak burada yapmak istediğin şey, kesinti tail. Yapmaya çalıştığınız şeyi başarmanın başka bir yolu yok ("güzel bir şekilde" bırakma kuyruğu) ve diğer cevaplar tailbaşka şekillerde durmanın bir yolunu sunsa da, daha iyi olamazlar.

Basmak ^C, Linux'ta bir görevi kesmeye çalışacaktır - bu tamamen normaldir ve bu süreç bir şeyin ortasındaysa ve bitmesine izin vermiyorsanız ve sonra da sadece "iyi olmayan" taraf ise "iyi değil" demektir. etkisi, bu süreçten geriye kalan şeylerdir. Örnek olarak, ^Cbir makekomutun ortasında kısmen derlenmiş bir yazılım bırakır, ancak sorun değil: Başka bir işlem makekaldığı yerden devam edecek / devam edecektir.


2
Aslında makeörnek, neden her zaman .DELETE_ON_ERROR:Makefile dosyalarımıza yazdığımızı hatırlatır - Komutlarından birinin bir sinyal aldığını öğrendiğinde, kısmen yazılmış ara dosyaları kaldırmak isteriz.
Toby Speight

İşlemler SIGINTToby'nin .DELETE_ON_ERROR:örneğinde belirtildiği gibi çıkıştan önce tuzağa düşebilir ve temizlenebilir .
sonraki duyuruya kadar duraklatıldı.

1
Evet, SIGINT'i yakalama yeteneği tam olarak neden @Arthur'un istediğini söyledim. Kuyruğa atmak için "iyi" olmaya gerek yok, onun duygularını incitmeyeceksin ^C:)
Josh


6

Bu işe yarar ve sorunuzu cevaplar, ancak özellikle tatmin edici bir çözüm değildir.

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

Bu, komutu 15 saniye çalıştıracak ve daha sonra, tuşuna basmanıza gerek kalmadan sizin için öldürecektir. ^C


5
Evet, bilgisayarı kapatmakta tailçalışacağım. Yine de yanlış değilsin sanırım.
Aaron,

5
tailSIGTERM ile sonlandırmak, SIGINT ile sonlandırmaktan daha iyi nasıl olabilir ?
Dmitry Grigoryev

1
@DmitryGrigoryev Tamamen haklısın - daha iyi değil. Ancak bu cevap, gerçekte gerçekte çok fazla kullanılmamasına rağmen, OP'nin sorusunu doğrudan cevaplamaktadır. Ancak, ping gibi şeyleri sonlandırmak için zaman aşımını kullandım, Control tuşuna basmak için bir menü seçimi gerektiren ve bir kontrolü serbest bırakmak için ikinci bir menü seçimi gerektiren bir Dell DRAC Java uygulaması kullanırken (sadece rahatsız edici bir Dell c5220 blade)
Criggie

0

Cevaplar bağlama göre farklılık gösterir. Kuyruğundan çıkmak için - zarif bir şekilde, bir tetikleyiciye ihtiyacınız olacak. Başlangıçta bir noktada bitecek olan bir görevin çıkışını izlemeye çalıştığınızı varsayalım - bu sizin tetikleyiciniz olabilir.

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

Geçmişte benzer fikirler kullandım.

Keyfini çıkarın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.