Pertanyaan Shell SIGKILL Keybinding


Bagaimana saya bisa mengatur keybinding untuk mengirim SIGKILL ke pekerjaan latar depan saat ini? Saya sudah tahu itu Ctrl+C aku s SIGINT dan Ctrl+\ aku s SIGQUIT. Saya ingin opsi yang lebih berat.

Adakah sesuatu yang serius yang tidak disarankan tentang hal ini?


15
2018-05-26 05:23


asal


Ini dikirim oleh driver terminal, bukan oleh shell (yang sepenuhnya tidak menyadari apa yang Anda lakukan dengan program). - grawity
Anda belum mencatat shell yang ditentukan, yang mana zsh, dan fakta bahwa pertanyaan itu berbicara tentang keybindings. Ini adalah pertanyaan tentang konfigurasi zsh's line editor, bukan tentang pengaturan terminal seseorang. - JdeBP


Jawaban:


Tidak disarankan atau tidak, itu sebenarnya tidak mungkin:

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

Anda bisa mendapatkan daftar kombinasi tombol Ctrl + [?] Yang ada saat ini dari stty -a; hanya saja 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 proses (SIGKILL dan SIGSTOP), jadi jika ketiga sinyal tersebut tidak berpengaruh, Anda harus menggunakan beberapa cara lain ( misal shell lain) untuk mematikan proses foreground.

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


21
2018-04-28 08:54





Ya, ada sesuatu yang tidak disarankan. Anda melompat langsung dari SIGINT ke SIGKILL sinyal. Saya menyarankan, seperti yang dilakukan orang lain, melihat mengirim SIGHUP atau SIGTERM sinyal sebelum menggunakan opsi nuklir. Lalu ada ketidaktahuan memiliki ini sebagai pengikatan kunci, yang tentu saja berarti bahwa ini hanya akan bekerja ketika ZLE aktif dan shell secara interaktif mendorong Anda untuk memasukkan, bukan ketika perintah sedang berjalan. (Untuk itu, kamu akan perlu mengkonfigurasi terminal, bukan shell, dan perlu memiliki disiplin garis terminal yang mengimplementasikan pengiriman SIGTERM sebagai ekstensi perilaku yang ditentukan POSIX.)

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

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

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

Kemudian Anda membangun sebuah widget yang ditentukan pengguna ZLE yang memanggil 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

2
2018-05-26 10:14



Saya kira dia tidak benar-benar berbicara tentang editor garis - jika dia mengetik ke shell, tidak akan ada proses latar depan, kan? Shell tidak akan pernah benar-benar melihat penekanan tombol jika ada proses latar depan berjalan dan terhubung ke tty saat ini. - lxgr