07
のパイプの結果として 、フォアグラウンド プロセス グループの一部としてパイプラインを含むサブシェルが作成されます。これは引き続きサブシェルを作成します (14
経由) ) 無期限に、フォーク爆弾を作成します。
$ for (( i=0; i<3; i++ )); do
> echo "$BASHPID"
> done
16907
16907
16907
$ for (( i=0; i<3; i++ )); do
> echo "$BASHPID" | cat
> done
17195
17197
17199
ただし、コードが実行されるまでフォークは実際には発生しません。これは 20
の最後の呼び出しです。
フォーク爆弾の仕組みを分解するには:
34
-46
という新しい関数を定義します59
- 呼び出し元の関数をバックグラウンドで呼び出し元の関数の別のインスタンスに再帰的にパイプする関数定義66
- フォーク爆弾関数を呼び出します
これはあまりメモリを集中的に使用しない傾向がありますが、PID を吸い上げ、CPU サイクルを消費します。
コードの最後のビット 79
関数 86
を実行しています .ここでフォークが発生しています。
セミコロンは最初のコマンドを終了し、別のコマンドを開始します。つまり、関数 97
を呼び出します。 .この関数の定義には、それ自体への呼び出しが含まれています (102
) であり、この呼び出しの出力はバックグラウンド バージョンの 110
にパイプされます。 .これにより、プロセスが無期限に支えられます。
関数 129
を呼び出すたびに C 関数 138
を呼び出しています .最終的に、これはシステム上のすべてのプロセス ID (PID) を使い果たします。
例
142
を交換できます 何が起こっているのかを把握できるように、他の何かと一緒に使用してください。
ウォッチャーを設定する
1 つのターミナル ウィンドウで次の操作を行います:
$ watch "ps -eaf|grep \"[s]leep 61\""
「ヒューズ遅延」フォーク爆弾をセットアップする
別のウィンドウで、わずかに修正されたバージョンのフォーク ボムを実行します。このバージョンは、自分自身を抑制しようとするため、その動作を調査できます。私たちのバージョンは、関数 151
を呼び出す前に 61 秒間スリープします。 .
また、呼び出された後、最初の呼び出しもバックグラウンドにします。 Ctrl + z 、次に 165
と入力します .
$ :(){ sleep 61; : | : & };:
# control + z
[1]+ Stopped sleep 61
[2] 5845
$ bg
[1]+ sleep 61 &
170
を実行すると コマンドを実行すると、最初のウィンドウに次のように表示されます:
$ jobs
[1]- Running sleep 61 &
[2]+ Running : | : &
数分後:
$ jobs
[1]- Done sleep 61
[2]+ Done : | :
ウォッチャーにチェックイン
一方、184
を実行している別のウィンドウでは :
Every 2.0s: ps -eaf|grep "[s]leep 61" Sat Aug 31 12:48:14 2013
saml 6112 6108 0 12:47 pts/2 00:00:00 sleep 61
saml 6115 6110 0 12:47 pts/2 00:00:00 sleep 61
saml 6116 6111 0 12:47 pts/2 00:00:00 sleep 61
saml 6117 6109 0 12:47 pts/2 00:00:00 sleep 61
saml 6119 6114 0 12:47 pts/2 00:00:00 sleep 61
saml 6120 6113 0 12:47 pts/2 00:00:00 sleep 61
saml 6122 6118 0 12:47 pts/2 00:00:00 sleep 61
saml 6123 6121 0 12:47 pts/2 00:00:00 sleep 61
プロセス階層
そして 195
このプロセス階層を示します:
$ ps -auxf
saml 6245 0.0 0.0 115184 5316 pts/2 S 12:48 0:00 bash
saml 6247 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
....
....
saml 6250 0.0 0.0 115184 5328 pts/2 S 12:48 0:00 bash
saml 6268 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
saml 6251 0.0 0.0 115184 5320 pts/2 S 12:48 0:00 bash
saml 6272 0.0 0.0 100988 468 pts/2 S 12:48 0:00 \_ sleep 61
saml 6252 0.0 0.0 115184 5324 pts/2 S 12:48 0:00 bash
saml 6269 0.0 0.0 100988 464 pts/2 S 12:48 0:00 \_ sleep 61
...
...
片付け時間
205
手に負えなくなる前に物事を止めます。この方法でクリーンアップを行うのは、少し手間がかかるかもしれません。 次のようにします:
フォーク爆弾が実行される疑似端末を決定する
$ tty
/dev/pts/4
疑似端末を殺す
$ pkill -t pts/4
何が起こっているのですか?
227
の各呼び出し と 230
C 関数 244
の呼び出しです。 255
から コマンドが実行されたシェル。