私はBASHで次のことをしました:
while true;do bash;done
私はこのワンライナーを書きましたが、最初はそれが次のことかどうかわかりませんでした。
しかし、それは2番目のケースだと思います。ワンライナーを実行すると、プロンプトが戻ってすぐに戻り、exitと別のexitを入力し始め、exit、exit、exit ...そしてまだ戻ってこなかったからです。メインシェル。
さて、非常に多くのサブシェルが開かれ、それぞれがプログラムであるため、それぞれに独自のPIDが必要だと思いました。
だから私はしました:
ps aux | grep bash
名前にbashが含まれる多くのプロセスが見られることを期待しています。
ただし、このようなものはなく、bashシェルは2つしかありませんでした。
どうしてそれが可能か、私はどこかでプロセス、シェル、サブシェル、PIDについて非常に間違った考えを持っていると思いますが、どこにあるのかわかりません。
ループは、各反復で1つの対話型シェルセッションを開始します。
インタラクティブセッションでは、プロンプトが表示されます(インタラクティブであるため)。それを終了すると、制御がループに戻り、別の対話型シェルが開始されます。
これがbash
、一度に大量のプロセスを取得しない理由です。ループを実行する親と、新しいプロンプトを表示する子の2つだけです。
ループを書くこともできます
while true; do bash; done
true
ユーティリティは、引数を取らない、それだけでシェルが「真」と解釈されるゼロの終了値が返されます。
bash
プロセスの爆発的増加(いわゆる「フォーク爆弾」)が必要だった場合は、次のように書いている可能性があります。
while true; do { bash & }; done
これbash
により、ループの各反復で対話型セッションが開始されますが、バックグラウンドプロセスとして開始されます。セッションはバックグラウンドプロセスとして開始されるため、ループは最新のbash
プロセスが終了するのを待たずに次のプロセスを開始します。
これから回復するには、システムを再起動する必要がある場合があります。
このフォーク爆弾は、反復ごとに1つの新しいプロセスしか開始しないため、実際よりも害がありません。他の人は、指数関数的にプロセスを開始する可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加