ループ内で並列処理を行うbashスクリプトがあります。並列プロセスでCPUを急上昇させたくないので、sleepコマンドを使用します。これが簡略化されたバージョンです。
(本当の間;眠る99999;完了)&
したがって、bashプロンプトから上記の行を実行すると、次のようになります。
[1] 12345
ここ[1]
で、はジョブ番号であり、12345
はwhileループのプロセスID(pid)です。私はしkill 12345
て取得します:
[1] +終了しました(trueの間、実行します) 睡眠99999; 終わり )
スクリプト全体が終了したようです。しかし、私はaを実行しps aux|grep sleep
、sleepコマンドはまだ強力ですが、独自のpidを使用していることがわかりました。私は殺すことができsleep
、すべてがうまくいくようです。ただし、最初にスリープを強制終了した場合、whileループは新しいsleep
pidを開始します。睡眠はwhileループと平行ではないので、これは私にとって非常に驚きです。ループ自体は単一の実行パスです。
だから私は2つの質問があります:
- sleepコマンドが独自のプロセスIDを取得したのはなぜですか?
- whileループとスリープを簡単に強制終了するにはどうすればよいですか?