中断されたプロセスを強制終了しますか?


17

私は少し混乱しました:

% vim tmp
zsh: suspended   vim tmp
% kill %1
% jobs
[1]  + suspended   vim tmp
% kill -SIGINT %1
% jobs
[1]  + suspended   vim tmp
% kill -INT %1
% jobs
[1]  + suspended   vim tmp

だから私はただ「自分でやる」ことに辞任し、後でなぜだろうと思う:

% fg
[1]  - continued   vim tmp
Vim: Caught deadly signal TERM
Vim: Finished.
zsh: terminated   vim tmp
%

ああ!

考えてみると、vimシグナルハンドラーに終了を指示するために実行する必要があるので、本当に理にかなっています。

しかし、明らかに私が意図したものではありません。

単一のコマンドで「ウェイクして終了」する方法はありますか?つまり、kill %N && fg %N?の組み込みエイリアス

バックグラウンドでの再開が機能しないのはなぜですか?のbg代わりにIの場合fg、VimはIまで生き続けfgますが、これは私の直感を壊します。

回答:


20

vi-vi-vi悪魔のものです。火で殺さなければなりません。またはSIGKILL

kill -KILL %1

組み込みkillのsはSIGCONT中断されたプロセスに送信するのに十分なほど親切なので、自分で行う必要はありませんが、プロセスが送信しているシグナルをブロックする場合、またはシグナルを処理することでプロセスが中断される場合は役に立ちません再び(デフォルトで、バックグラウンドプロセスが端末から読み取ろうとすると、送信されますSIGTTIN。未処理の場合、プロセスは中断されます)。


1
いったいなぜSIGABRTを使用するのですか?プログラムのバグを示すためのものです。SIGKILLは、プログラムが必要かどうかに関係なく、今すぐプログラムを強制終了するため、ここにあります。
ジル 'SO-悪であるのをやめる'

1
実際には、SIGTERM少なくともプロセスのハンドラーがない場合は、スリープ状態のプロセスを目覚めさせるように見えます。私はそれが私が持っ覚えているので、このように動作するために使用されなかったと思いますbgか、fgそれが信号を受信して、離れて行くだろう前に何か。しかしawk 'BEGIN{while(42){}}' &、とstrace kill $!でテストしましたが、kill(2)システムコールは1つしかありませんSIGTERM
ピーター・コーデス

6

vimは、sigprocmask(2)一般的なシグナルを無視するシグナルハンドラー(およびおそらく設定も)をインストールして、迷っているcontrol + cまたはランダムなキルシグナルによって編集中のファイルが失われないようにします。より簡単なプログラムはすぐに殺されます:

% cat busyloop.c
int main(void) {
for (;;) { ; }
return 0;
}
% make busyloop
cc     busyloop.c  -o busyloop
% ./busyloop
^Z
zsh: suspended  ./busyloop
% kill %1
%
[1]  + terminated  ./busyloop

vim(安全に)exitを作成するには、バッファvimを受け入れるTERMUSR1または何かを保存する(または破棄する)シグナルハンドラーが必要になりvimます。


「vimをこのように終了させるために何をしようとしていますか?」-何も、私が編集していたのは本当に「tmp」ファイルでした。vimサスペンションをテストするためのプログラムの不適切な選択でした。
OJFord

1
「一般的な信号を無視して、編集中のファイルが浮遊制御+ cまたはランダムなキル信号によって失われないようにします」-しかし、fgtiを終了するとすぐに、一時停止している間だけ停止しましたか?
OJFord

2
@OllieFord:SIGKILLスリープ状態のプロセスをウェイクアップするだけで、死ぬことができます。カスタムハンドラーが存在する中断されたプロセスにシグナルを送信しても、ウェイクされませ。(以外にもSIGCONT、当然のことながら、信号を継続する。 bgそしてfg、送信SIGCONT。)
ピーター・コルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.