Daha azıyla daha az kesinti


13

Program çıktısını genellikle daha azına bağlarım, ör.

produce_output | less

Bu produce_output, büyük miktarda çıktı üretene kadar harika çalışır . Dosyanın derinliklerinde bir metin ararsam daha az rapor olur

Calculating line numbers... (interrupt to abort)

Control + C ile kesintiye uğrarsam produce_output, öldürür , bu da daha fazla çıktı üretmesini durdurur. Kesintiyi daha azına göndermenin bir yolu var mı, bu yüzden produce_outputçalışmaya devam ediyor mu?

Kullanabileceğimi biliyorum kill -INT less_process, ama bence daha iyi bir çözüm olmalı.

Yanıtlar:


15

Normalde bir boru hattındaki tüm işlemler aynı işlem grubunda çalışır ve bu da hepsinin sinyali almasına neden olur. Farklı bir pgrp'de setsid foo | lessçalıştırmak için kullanabilirsiniz foo.


OP tarafından ortaya çıkan sorunun ışığında, CTRL + C'yi daha az kesmenin bir yolu olarak kullanma kararı çok talihsiz görünüyor. Bu özel sinyalin neden seçildiğini biliyor musunuz? Başka bir sinyal daha az sorunlu olabilir mi?
Piotr Dobrogost

@PiotrDobrogost: Başka hangi sinyali önerirsiniz? Özel klavye kısayollarına sahip pek çok kişi yoktur, sadece SIGINT (Ctrl-C) ve SIGQUIT (Ctrl- \) vardır ve ikincisi sadece programdan ayrılmakla kalmaz, programdan hemen çıkmayı amaçlamaktadır. Geri kalanlara sadece üzerinden ulaşılabilir kill.
user1686

Sorun, daha az kesintiye uğratmak için sinyal kullanmaktan kaynaklanıyor gibi görünüyor. Bunun yerine, normal bir anahtar / kısayol olsaydı, sorun ilk etapta olmazdı. Ancak bir sinyale duyulan ihtiyaç, sürecin aynı anda selecthem bir dosya / borudan hem de terminalden girişi beklemek için kullanamamasından kaynaklanıyor.
Piotr Dobrogost

@PiotrDobrogost: Olabilir, F(izleme) modu böyle çalışır. Borular ve tty'ler aynı şekilde parçalanabilir.
user1686

Neden takip modunun böyle çalıştığını düşünüyorsunuz? Olayların akışının kabuk CTRL + C aldığını ve SIGINT sinyalini daha azına gönderdiğini ve bu sinyali klavye / terminal dinlemeden asenkron olarak aldığını düşünüyorum .
Piotr Dobrogost

9

İle satır numaralarını devre dışı bırakabilirsiniz.

   -n or --line-numbers

seçeneği.

produce_output | less -n

-1: OP'nin kışkırtıcı problemini çözebilir, ancak OP'nin gerçek sorusunu cevaplamak için hiçbir şey yapmaz (yani, bir süreci kesintiye uğratmak).
goldPseudo

2
Maalesef, istemediğiniz bir özellik ile daha az başlamak ve daha sonra bir özelliği devre dışı bırakabileceğiniz bir özelliği devre dışı bırakmak için sinyal göndermeye çalışmak bir çözüm değil bir çözümdür. Tabii ki @grawity çözümü güzel (ve ben oy verdim) ama hadi: başka bir gruptaki ilk işlemi başlatmak, gerekli olmayan bir görevi (satır sayma) kesmek için bir sinyal gönderebilmek için gerçekten birazcık çok iş.
Matteo

1
Bu, sorumda ortaya koyduğum soruna adil bir çözüm. Ancak, kesintiler yalnızca daha az sayılan satırdan daha fazla durur - örneğin, uzun bir aramayı da keser. Bu nedenle, @ grawity'nin çözümü tercih edilir, çünkü herhangi bir kesinti kullanımını daha az kapsayacaktır. Soruda bunu daha açık bir şekilde ele almadığım için kötüyüm!
Ed McMan

@EdMcMan Tabii ki yer çekiminin çözümüne de oy verdim ve her zaman faydalı olabilecek yeni bir şey öğrenmekten mutluluk duyuyorum.
Matteo

0

Büyük miktarda çıktıyla çalışırken, çıktıyı bir dosyaya göndermenin ve izlemek tail -fveya kullanmanın çok yararlı olduğunu gördüm less +F, örneğin:

produce_output > out 2>&1 & less +F out

2>&1Sözdizimi için stdout ve stderr gitmek hem emin olur outsadece istiyorsanız kaldır --- stdout'u dosyaya gidiş olduğunu. Bu şekilde, çıktıyı üreten programla uğraşmak zorunda kalmadan çıktıyı çeşitli şekillerde (farklı bir makineden bile) inceleyebilirsiniz.

Bu 2>&1bash-özgü olabilir unutmayın (emin değilim). Çıktı dosyası için yeterli disk alanınız olduğundan emin olun :-)


Kuyruk size sadece dosyayı gösterecek, Ed daha az etkileşimli kullandığını belirtti (örneğin, dosyada arama yapmak zorunda)
Matteo

2>&1POSIX, çıplak >&bir bashizmdir.
user1686

FWIW, 2> & 1 ayrıca Windows XP, 7, 2008 vb. Üzerinde de çalışır.
jftuga

@Matteo: evet, benim örneğimde kullanmalıydım less +F; Cevabımı yeni güncelledim.
jrennie

1
@Matteo: Satır sayma ile aynı sorun değildir less +F(çünkü less +Fveriler üretildiği gibi işlenir). Verdiğim örnek , aslen gönderilenle aynı soruna sahip değil : ctrl + c kesilmeyecek process_output. Eğer 'takip et' işlevselliği umursamazsa produce_output > out 2>&1, o zaman çalışabilir less out. Bir sorun produce_output | lessboruyu bozarsa (örneğin yanlışlıkla 'q' 'dan vurmak less), o produce_outputzaman ölür (özel SIGPIPE kullanımı olmadan).
jrennie

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.