シェルSIGKILLキーバインド


18

SIGKILL現在のフォアグラウンドジョブに送信するキーバインドを設定するにはどうすればよいですか?私はすでにそれを知っているCtrl+がCあるSIGINTCtrl+ \ですSIGQUIT。もっと厳しいオプションが欲しいです。

これについて真剣に勧められないことはありますか?


シェルではなく、ターミナルドライバによって送信されます(これは、プログラムで何をしているのかを完全に認識していません)。
悲しみ

指定されたシェル(zsh)と、質問がキーバインドについて説明しているという事実に注意していません。これはzsh端末の設定ではなく、のラインエディタの設定に関する質問です。
JdeBP

回答:


26

賢明でなくても、実際には不可能です。

Control + [?]キーバインドは、シェルではなくttyドライバーによって実際に処理されます。これは、フォアグラウンドで実行されているプロセスがある限り、ターミナルの入出力がプロセスに直接転送されるためです。シェルは、キー入力に基づいて行動することはできません(または、見ることすらできません)。

現在割り当てられているCtrl + [?]キーの組み合わせのリストは、から取得できますstty -a。ただし、intr(SIGINT、通常Ctrl + Cにバインド)quit(SIGQUIT、通常Ctrl + \にバインド)およびsusp(SIGSUSP、通常Ctrl + Zにバインド)のみが実際のUNIX信号に対応します。(kill,たとえば、SIGKILLを送信せず、現在の入力を削除します。)

残念ながら、プロセスで無効にできない2つのシグナル(SIGKILLとSIGSTOP)のいずれかを送信する方法はないため、上記の3つのシグナルのすべてが効果がない場合は、他の方法を使用する必要があります(たとえば、別のシェル)フォアグラウンドプロセスを強制終了します。

(実際には、3つの信号すべてを捕捉することに加えて、フォアグラウンドプロセスは、ttyを「raw」モードに設定することにより、そもそも特別なキーの組み合わせを無効にすることもできます。ローカルでCtrl + Cを押してリモートホストに送信します。)


3

はい、お勧めできません。あなたは直接信号から飛び降りSIGINTていSIGKILLます。私は、他の人がそうするように、核オプションを採用する前にSIGHUPまたはのSIGTERM信号を送ることをお勧めします。次に、これをキーバインディングとして使用することはお勧めできません。これはもちろん、コマンドの実行中ではなく、ZLEがアクティブでシェルが入力を対話形式で要求している場合にのみ機能することを意味します。(そのためには、シェルではなく端末を構成する必要ありSIGTERM、POSIXで指定された動作を拡張機能として送信することを実装する端末回線制御が必要になります。)

そのメモでは、ターミナルではなくシェルラインエディタのキーバインドについて尋ねていることに誰もまだ気付いていないようです。質問の最初の部分に回答するには、次のようにします。

シェル関数を設定して、「現在の」ジョブに信号を送信します。

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

次に、このシェル関数を呼び出すZLEユーザー定義ウィジェットを作成します。

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

そして最後に、そのウィジェットを選択したキーにバインドします。

bindkey "^/" terminate-current-job

1
私は彼が実際にラインエディタについて話していないと思います-彼がシェルに入力している場合、実行中のフォアグラウンドプロセスはありませんよね?実行中のフォアグラウンドプロセスが存在し、現在のttyに接続されている場合、シェルは実際にキー押下を認識しません。
lxgr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.