Shell SIGKILL Anahtar Bağlama


18

SIGKILLGeçerli ön plandaki işe göndermek için bir tuş bağlama özelliğini nasıl ayarlayabilirim ? Ctrl+ ' CNın SIGINTve Ctrl+' \nın zaten olduğunu biliyorum SIGQUIT. Daha ciddi bir seçenek istiyorum.

Bu konuda ciddi olarak tavsiye edilemez bir şey var mı?


Terminal sürücüsü tarafından gönderilir, kabuk tarafından değil (programla ne yaptığınızdan tamamen habersizdir).
user1686

Belirtilen kabuğu zshve sorunun tuş bağlamalarından bahsettiği gerçeğini not etmediniz. Bu, zshbirinin terminal düzenleyicisini ayarlamakla ilgili değil, hat düzenleyicisini yapılandırmakla ilgili bir sorudur .
JdeBP

Yanıtlar:


27

Tavsiye edilemez veya edilmez, aslında imkansızdır:

Control + [?] Tuş bağlamaları aslında tty sürücüsü tarafından işlenir, kabuk tarafından değil, çünkü ön planda çalışan bir işlem olduğu sürece, terminalinizin giriş ve çıkışı doğrudan işleme yönlendirilir. Kabuk, tuşa basma hareketleriniz üzerinde asla hareket edemez (hatta göremez).

Şu anda atanmış olan Ctrl + [?] Tuş birleşimlerinin bir listesini stty -a; bununla birlikte, sadece intr(genellikle Ctrl + C'ye bağlı SIGINT) quit(SIGQUIT, genellikle Ctrl + \ 'ya bağlıdır) ve susp(genellikle Ctrl + Z'ye bağlı SIGSUSP) gerçek unix sinyallerine karşılık gelir. ( kill,örneğin, SIGKILL göndermez, ancak geçerli girişi siler.)

Ne yazık ki, bir işlem tarafından devre dışı bırakılamayan iki sinyalden birini (SIGKILL ve SIGSTOP) göndermenin bir yolu yoktur, bu nedenle belirtilen üç sinyalin hepsinin bir etkisi yoksa, başka bir yol kullanmanız gerekir ( örneğin başka bir kabuk) ön plana çıkarmak için

(Aslında, üç sinyalin tümünü yakalamaya ek olarak, ön plan işlemi, tty'yi "raw" moduna ayarlayarak ilk başta özel tuş kombinasyonlarını bile devre dışı bırakabilir. SSH bunu yapar, örneğin - bu şekilde geçiş yapabilir uzak ana bilgisayara yerel olarak basılmış bir Ctrl + C tuşlarına basın.)


3

Evet, tavsiye edilemez bir şey var. Sen doğrudan sıçrayan konum SIGINTiçin SIGKILLsinyal. Diğer insanların yaptığı gibi, nükleer seçeneği kullanmadan önce SIGHUPveya SIGTERMsinyallerini göndermeyi öneriyorum . Daha sonra bunu bir anahtar bağlama olarak sahip olmanın kaçınılmazlığı var, bu elbette sadece ZLE aktifken çalışacak ve kabuk komutlar çalıştırıldığında değil, etkileşimli olarak sizden giriş yapmanızı ister. (Bunun için, olur uygular göndererek o bir terminal hat disipline sahip terminalin değil, kabuk ve gereğini yapılandırmanız gerekir SIGTERMPOSIX davranışı belirtilen bir uzantısı olarak.)

Bu notta, başka hiç kimse terminali değil, kabuk satırı editörü tuş bağlamalarını sorduğunuzu fark etmedi. Sorunuzun ilk bölümünü yanıtlamak için:

Sinyali "geçerli" işe göndermek için bir kabuk işlevi ayarladınız.

function terminate-current-job() { kill -s TERM %+ ; }

Daha sonra, bu kabuk işlevini çağıran ZLE kullanıcı tanımlı bir widget oluşturun.

zle -N terminate-current-job terminate-current-job

Son olarak, bu widget'ı istediğiniz bir tuşa bağlarsınız.

bindkey "^/" terminate-current-job

1
Aslında çizgi editörü hakkında konuşmuyor sanırım - eğer kabuğa yazıyorsa, ön plan süreci olmayacaktı, değil mi? Mevcut tty'ye çalışan ve bağlı bir ön plan işlemi varsa, kabuk hiçbir zaman tuşlara basmaz.
lxgr
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.