無停電プログラムを中断するには?

無停電プログラムを中断するには?

mysqldコマンドラインから実行すると、いくつかの起動メッセージが表示され、応答が停止します。出力を生成せずに入力を無視するので、それを削除する方法がないようです。 ctrl+z と ctrl+c は何もしないので、端末に戻ることはできません。新しいセッションを開始する必要があります。たとえば、SSHを介してサーバーに接続する場合は、新しいSSH接続を開始する必要があることを意味します。

これは非常に迷惑なことです。 bashで現在実行中のプロセスを無効にするように指示する方法はありますか? ctrl + zを使用すると、他のプログラムを一時停止できますが、mysqldは一時停止できません。理由はわかりません。起動するとmysqld &バックグラウンドで実行され、fg誤って入力しない限り正常に信号を送信できます。そうでなければ、通常のプロセスのように動作するので、ctrl +zがうまくいかない理由がわかりません。私はこれがbashの一部であり、プロセスの制御を受けていないと思うからです。

それでは、Ctrl + Zが機能していないときにCtrl + Zを置き換える方法はありますか?

答え1

このコマンドは、stty -a現在の端末のすべてのキーボードショートカットを表示します。一般的に、Unixシリーズシステムでマッピングされる信号は、Ctrl+ C(SIGINT)、Ctrl+ \(SIGQUIT)、Ctrl+ Z(SIGTSTP)のみです。他のシグナルへの他のバインディングはないため、現在のセッションでキーボードを使用して他のシグナルを送信することはできません。

通常、dプログラム名の最後の数字は通常「デーモンプロセス」を示します。デーモンはバックグラウンドで実行され、標準入力/出力(パイプ、信号、ソケットなど)以外の手段で動作するように設計されています。これはそれを意味する可能プログラム自体がバックグラウンドで実行されていないと、予期しない動作が発生する可能性があります(たとえば、デーモンが入力、出力でタスクを実行するか、ループ/スタンバイ中にタスクを実行するため、端末が「ハング」したように見えます)

多くの場合、デーモンは特定のシグナルに対してトラップを持ち、それを異なる方法で処理または無視することがあります。テスト目的でバックグラウンドで実行中にSIGINT(+kill -2と同じ)、SIGQUIT(+と同じ)、またはSIGTSTP(+と同じ)を送信しましたか?CtrlCkill -3Ctrl\kill -20CtrlZmysqld

編集:マッピングを変更するには、stty以下を作成する必要があります。

stty <action> <new-mapping>

たとえば、SIGINTをCtrl+に再マップします。X

stty intr ^x

この設定は、現在のセッション中に現在の端末にのみ適用されます。

答え2

Ctrl+ はZ実際には bash ではなく、カーネルの汎用端末インタフェース機能です。これにより、SIGTSTP信号がフォアグラウンドプロセスに送信されるようになります。同様にCtrl、+はCSIGTERMを送信し、Ctrl+は\SIGQUITを送信します。

Ctrlプログラムが+Zの効果を失うようにする2つの方法があります。

  • プログラムは SIGTSTP シグナルを無視できます。
    デバッガを使用してプロセスの信号動作を確認できます。 Linuxでは、次の情報を使用してこの情報を入手できます。/procgrep Sig /proc/1234/statusここで、1234はプロセスIDであり、どの信号が無視されるか(SigIgn、無害にバウンスされる)かブロックされるか(SigBlk、プログラムが入力を許可するまで待機状態になります)を示します。数字はビットマスクで、16進数で記録されます。 SIGTSTPはシグナル20(kill -lbashで実行中)なので、SigIgn行の右側の5番目の数字が8以上の場合、シグナルは無視されます。
  • プログラムはキーバインディングを変更できます。
    コマンドラインを使用して現在のキーバインディングを確認できます。たとえば、stty -a </dev/pts/42プロセスが実行されている端末はどこですか?/dev/pts/42探すsusp = ^Z

デーモンはほとんどのシグナルを無視できます。それ自体が分岐しない場合、バックグラウンドで始まります(ほとんどのデーモンは実際に起動直後に子プロセスを分岐し、親プロセスもすぐに分岐します)。フォアグラウンドで起動した場合は回復する方法がありますが(対応するシェルまたは親シェルにシグナルを送信する)、他のシェルが必要です。

関連情報