Pengikat Tombol Shell SIGKILL

18

Bagaimana saya bisa mengatur ikatan kunci untuk mengirim SIGKILLke pekerjaan latar depan saat ini? Saya sudah tahu bahwa Ctrl+ Cadalah SIGINTdan Ctrl+ \adalah SIGQUIT. Saya ingin opsi yang lebih parah.

Apakah ada sesuatu yang serius tidak disarankan tentang ini?

drewrobb
sumber
Ini dikirim oleh driver terminal, bukan oleh shell (yang sama sekali tidak menyadari apa yang Anda lakukan dengan program ini).
user1686
Anda belum mencatat shell yang ditentukan, yaitu zsh, dan fakta bahwa pertanyaan tersebut berbicara tentang keybindings. Ini adalah pertanyaan tentang mengkonfigurasi zsheditor baris, bukan tentang mengatur terminal seseorang.
JdeBP

Jawaban:

26

Tidak disarankan atau tidak, itu sebenarnya tidak mungkin:

Binding key Control + [?] Sebenarnya ditangani oleh driver tty dan bukan oleh shell, karena selama ada proses yang berjalan di latar depan, input dan output terminal Anda akan diteruskan langsung ke proses. Shell tidak akan pernah bisa bertindak atas (atau bahkan melihat) penekanan tombol Anda.

Anda bisa mendapatkan daftar kombinasi tombol Ctrl + [?] Yang saat ini ditetapkan dari stty -a; Namun, hanya intr(SIGINT, biasanya terikat ke Ctrl + C) quit(SIGQUIT, biasanya terikat ke Ctrl + \) dan susp(SIGSUSP, biasanya terikat ke Ctrl + Z) sesuai dengan sinyal unix yang sebenarnya. ( kill,misalnya, tidak mengirim SIGKILL, tetapi menghapus input saat ini.)

Sayangnya, tidak ada cara untuk mengirim salah satu dari dua sinyal yang tidak dapat dinonaktifkan oleh suatu proses (SIGKILL dan SIGSTOP), jadi jika ketiga sinyal yang disebutkan tidak memiliki efek, Anda harus menggunakan cara lain ( misalnya shell lain) untuk mematikan proses foreground.

(Sebenarnya, selain menangkap ketiga sinyal, proses latar depan bahkan dapat menonaktifkan kombinasi tombol khusus di tempat pertama dengan mengatur tty ke mode "mentah". SSH melakukan ini, misalnya - ini adalah bagaimana ia dapat menyampaikan Ctrl + C yang ditekan secara lokal ke host jarak jauh.)

lxgr
sumber
3

Ya, ada sesuatu yang tidak disarankan. Anda melompat langsung dari SIGINTke SIGKILLsinyal. Saya menyarankan, seperti yang dilakukan orang lain , melihat pengiriman SIGHUPatau SIGTERMsinyal sebelum menggunakan opsi nuklir. Lalu ada ketidaksanggupan memiliki ini sebagai pengikat kunci, yang tentu saja berarti bahwa itu hanya akan berfungsi ketika ZLE aktif dan shell secara interaktif meminta Anda untuk input, bukan ketika perintah sedang berjalan. (Untuk itu, Anda akan perlu mengkonfigurasi terminal, tidak shell, dan kebutuhan untuk memiliki disiplin baris terminal yang mengimplementasikan mengirimkan SIGTERMsebagai ekstensi POSIX ditentukan perilaku.)

Pada catatan itu, tidak ada orang lain yang tampaknya telah memperhatikan bahwa Anda bertanya tentang keybindings editor baris shell, bukan terminal. Untuk menjawab bagian pertama dari pertanyaan Anda, maka:

Anda mengatur fungsi shell untuk mengirim sinyal ke pekerjaan "saat ini".

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

Kemudian Anda membuat widget ZLE yang ditentukan pengguna yang menjalankan fungsi shell ini.

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

Kemudian, akhirnya, Anda mengikat widget itu ke kunci pilihan Anda.

bindkey "^/" terminate-current-job
JdeBP
sumber
1
Saya kira dia tidak benar-benar berbicara tentang editor baris - jika dia mengetik di shell, tidak akan ada proses foreground yang berjalan, kan? Shell tidak akan pernah benar-benar melihat penekanan tombol jika ada proses latar depan berjalan dan terhubung ke tty saat ini.
lxgr