コマンドラインでkill bashループを実行する

コマンドラインでkill bashループを実行する

ループでコマンドを実行します。 bashコマンドラインに直接ループを作成します。

$ while true; do mycommand; done

mycommandIOをたくさん実行し、イベントを待つ命令なので、プロセッサ時間をあまり消費しません。

ループをどのように切断できますか?ctrl-cまたは、キーを押すとctrl-\コマンドは終了しますが、すぐに再起動します。他の端末にログインしてコマンドを終了しても、状況は同じです。

ターミナルセッションを終了せずにループを切断できますか?

答え1

対話的に開始されたループを終了する簡単な方法は、停止コマンド(Ctrl- Z)です。このコマンドはジョブ番号(たとえば)を印刷して[2]+ Stoppedからループを終了できますkill %2

答え2

ps -fが欲しい。 pstreeも非常に便利です。 PPID(親PID)を確認してください。

$ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
rui       7725  7722  0 13:30 pts/0    00:00:01 -bash
rui       8062  7725  0 14:09 pts/0    00:00:00 ps -f

$pstree-g

├─starter(1600)───charon(1603)─┬─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ │ (1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) │ ├─{charon}(1603) ─{カロン}(1603)

答え3

いくつかの背景知識:

あなたのコマンドはmycommandSIGINTを受け取ったときに再送されず、ただ終了します。したがって、bash実行ループのインスタンスは、実行を終了するためにCTRLどの+がC使用されているかを判断することはできませんmycommand。キーボードショートカット(使用想像など)のためにviシェルを終了することは望ましくないので、bash他のループの繰り返しを続けてください。

mycommand最終的な解決策は、SIGINTを受け取ったら自分で終了するように修正してbash停止しなければならないと知らせることでした。

void sigint_handler(int sig)
{
    // Execute your normal handler
    signal(SIGINT, SIG_DFL); // don't catch the signal anymore
    kill(getpid(), SIGINT); // kill itself with the same signal
}

源泉:http://www.cons.org/cracauer/sigint.html

問題を解決できない場合は、mycommandターミナルセッションを閉じるか、bashプロセスの現在のインスタンスと順番に実行されているループを終了する必要があります。mycommand

関連情報