ループでコマンドを実行します。 bashコマンドラインに直接ループを作成します。
$ while true; do mycommand; done
mycommand
IOをたくさん実行し、イベントを待つ命令なので、プロセッサ時間をあまり消費しません。
ループをどのように切断できますか?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
いくつかの背景知識:
あなたのコマンドはmycommand
SIGINTを受け取ったときに再送されず、ただ終了します。したがって、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