Ctrl + cはプロセスを強制終了しません


8

私は答えを探しましたが、これまでのところ、私の質問に答えるものは何もありません。現在Ubuntuサーバーにログインしていますが、プロセスを実行すると、そのサーバーで割り込みを実行できません。これが私のstty -aです。

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

割り込みを変更する.bashrcには何もありません。

これは、rootを含むすべてのユーザーで同じです。また、さまざまな端末を使用してさまざまな場所からログインしようとしましたが、この同じ結果が表示されるたびに、ログインにsshとssh -Xの両方を使用しました。

編集:ローカルではすべての割り込みが正常に機能します。

更新:私はまだ答えを探しています。私の友人もまったく同じ問題を抱えています。問題は、(PC、Mac、Linuxから)ログインしたときに、キーボードがこれらのキーを認識しないことです(正しくマッピングされていても)。


の出力Ctrl+VとヒットはCtrl+C何ですか?でプロセスを強制終了しようとしましたkill -s 2 <pid_of_process>か?これは、SIGINTシグナルをプロセスに送信することと同じです。端末エミュレータのキー設定を確認してください。

出力は正しいです。次のCtrl + Vを実行してからCtrl + CIを実行すると、^ Cが取得されます。Ctrl + Vを押してからCtrl + Zを押しても^ Zが得られます。別の端末からこれを行うと、killでプロセスを強制終了できます。また、そのローカルに注意し、他の端末では、これらのコマンドは正常に動作
user700786

3
Ctrl+C別のプロセス(例:)の実行中にヒットしてみましたcatか?多分それは無視するそのプロセスですCtrl+C。または、Ubuntuサーバーのローカルで、その特定のプロセスがに応答することを意味します。そのCtrl+C場合、どの端末で試しましたか?何についてscreenのセッション?
Gilles「SO-悪をやめる」

私のマシンのターミナルで何かを実行すると、割り込みは問題なく取得されます。すぐにサーバーにsshして、割り込みを取得しません。私が試したどのプロセスも割り込みを拾いません
user700786

コマンドが強制終了された場合kill -s 2-s 2、それSIGINT(通常、Ctrl + Cを押したときに送信される信号、デフォルトkillSIGTERM)に注意)、コマンドは割り込みを無視していません。他の何かがそれを拾っています。これをローカルで実行して機能する場合、クライアントマシンの同じターミナルを使用してローカルで何かを実行したり、サーバーマシンでターミナルエミュレータをローカルで実行したりしますか?あなたは、Windowsの世界からはCtrl + Cを模倣しようとしているいくつかのエミュレータを使用している場合、私は...不思議
njsg

回答:


5

ctrl+ cプログラムを強制終了することはありません。

それだけではありません。

POSIX標準で定義されている一連の信号があり、これらは実行中のプログラムを制御するために使用されます。

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ ターミナルから実行したプログラムにc信号2「キーボードから割り込み」を送信します。

その信号を処理するのは完全にプログラム次第であり、それはそれについてそれが望む何でもすることができます。多くのスクリプト言語インタープリターは、呼び出されたスクリプトを強制終了して正常に終了することにより、デフォルトの方法でこれを処理します。

特に自動コンテキストからプログラムを終了する場合は、singal 15をお勧めkillします。プログラムを使用して、id(pid)でプロセスにシグナルを送信できます。

kill -15 <pid>

私の知る限り、プログラムはこのシグナル自体を受信し、できるだけ早くASAPを終了する必要があります。

ただし、プログラムがシグナル15を無視した場合、プログラムは存続します(そして、アクセス許可エラーのためにシグナルの送信に失敗していません)

kill -9 <pid>

シグナル9は、私の知る限り、カーネル(タスクマネージャー、およびハードウェアインターフェイス)によって解釈されます。カーネルはプログラムの処理を突然停止し、そのすべてのリソースの割り当てを解除/解放します。


3

ここにいくつかの筋金入りのトリックがあります:

Control-Z

プロセスを一時停止し、そのプロセスのジョブIDを返します

次に:

kill -9 %1

(1をジョブIDに置き換えてください)。

注:パーセンテージは必須です!そうしないと、initプロセスを強制終了します。つまり、カーネルを強制終了し、システム全体がクラッシュします(その間にスペースを入れないでください)。


0

Ctrl + cはプロセスを強制終了しません。現在実行中のプロセスを途中で停止するだけです。プロセスを強制終了するには、 "KILL"コマンドを使用する必要があります


7
実際kill、プロセスにシグナルを送信します。強制終了しません。で送信されるデフォルトの信号killTERM、で送信される信号ctrl+cSIGINTです。
fmanco

0

私はこの特定の問題についてこの古いフォーラム投稿に遭遇しました。デフォルトの割り込みシーケンスは、別の設定ファイルのどこかで上書きされる可能性があるようです。

このプロセスを外部で強制終了したい場合は、killを使用できます。最も極端なkill -9にジャンプするのではなく、プロセスの強制終了に関するこの記事で説明されているようにkillをエスカレーションする必要があることに注意してください。

Wikipediaは、killプログラムの優れたリソースです。また、Unixシグナルとその機能のリストもここにあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.