これは本当に奇妙な問題ですが、新しいシステム(Fedora、Ubuntu)では、ctrl + cは特定のツールには影響しません。
ほぼ1分間実行されるyumlistを実行すると、ctrl + cで実行するために中断することはできません。
$time yum list >/dev/null
^C^C^C^C^C^C^C^C^C
コマンドの実行は停止しません。
ただし、検索を中断することは可能です。
$ time find / >/dev/null 2>&1
^C
real 0m0.741s
user 0m0.033s
sys 0m0.124s
何が原因なのか気になります。
次の設定が必要です。
$ stty -a
speed 38400 baud; rows 36; columns 158; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
問題の説明はまだ見つかりませんでした。誰かがそのような人に光を当ててくれたら幸いです。
前もって感謝します。
これはyumのバグです。標準のシグナル処理を無視し、アプリが標準のシグナルに反応しないようにするのは良い考えだと考えるLinux開発者がますます増えているようです。
男7信号
Standard Signals
Linux supports the standard signals listed below. Several signal numbers are architecture-dependent, as indicated in the "Value" col-
umn. (Where three values are given, the first one is usually valid for alpha and sparc, the middle one for ix86, ia64, ppc, s390, arm
and sh, and the last one for mips. A - denotes that a signal is absent on the corresponding architecture.)
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
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
これは悪い習慣です。
一部のアプリケーションは、他のライブラリとの奇妙な相互作用のためにSIGINT
をトラップします。代わりにSIGQUIT
を送信してみてください(経由 Ctrl\stty
出力で指定されたとおり)。
Ignacioが述べたように、一部のアプリケーションはSIGINT
をトラップするだけで、他のアプリケーションはすべてのキーボード入力をキャプチャします。
C-cが機能しない場合は、すでに説明したC- \を試してみてください。これが機能しない場合は、プロセスをバックグラウンドで実行してみてください:C-z。そしてkill -s SIGKILL <pid>
でそれを殺します
呼び出しているコマンドの信号処理に明確に関連しています。処理に関する未解決のyumバグの数を参照してください。
Red Hat Bugzilla –バグリスト
https://bugzilla.redhat.com/buglist.cgi?quicksearch=yum+Ctrl-C
Ctrl-C(SIGINT
)は、通常の意図(プロセスの強制終了)ではなく、他の動作(次のミラーへのスキップ)を制御するために使用された可能性があります。
Re:なぜSIGQUIT
は何の役にも立たないようです-定義されたハンドラーがないかもしれません。
実際、yumが使用するrpmlibは、ctrl-cシグナルハンドラーを取得して無視しています。これについては、yumのレベルでできることはたくさんあります。面倒ですが、すべてを解決する価値があるかどうかはわかりません。 Fedoraの新しいバージョンは、これの処理を正常に改善し、Rawhide(F15になる)の下のyumがテストケースに対してこれを行うようになりました。
$ time yum list >/dev/null
^CTraceback (most recent call last):
File "/usr/lib64/python2.7/site.py", line 553, in <module>
main()
File "/usr/lib64/python2.7/site.py", line 544, in main
execsitecustomize()
File "/usr/lib64/python2.7/site.py", line 500, in execsitecustomize
import sitecustomize
KeyboardInterrupt
real 0m0.164s
user 0m0.081s
sys 0m0.073s
それでも、実際に議論するのが難しいSIGINTを使用してRPMデータベースへの変更を中断することはできません。
これは通常、アプリケーションがCPUスケジューラキューから実行を再開できないために、実際にシグナルに応答できない状態にある場合に発生します。良い例は、アプリケーションがブロッキング操作(メインスレッドでの同期ディスクI/O、スワップイン/アウト、ブロッキングネットワークI/Oなど)を待ってハングしている場合です。これがyumであることを考えると、私はそれを推測していますリポジトリ/ミラーリスト構成で定義された1つ以上のソースへの接続がタイムアウトしますが、キャッシュ、RPMデータベース(BDBの破損を含む)、またはその他のさまざまなものにアクセスするディスクI/Oの問題である可能性があります。
任意のアプリケーションでこれの動作をテストする良い方法:NFS共有をハードマウントし、NFSサーバーをオフラインにして、そのディレクトリを開こうとするプログラムを使用してみてください(findまたは/ bin/lsが良い例です)。カーネルが共有の状態を把握するのを待つ間、SIGKILL以外には何も応答しません。