GNU/Linux >> Linux の 問題 >  >> Linux

フォーク爆弾の fork() はどこですか :(){ :|:&};:?

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 から コマンドが実行されたシェル。


    Linux
    1. Linux サブシステムのファイルシステムは Windows 10 のどこにありますか?

    2. RHEL6 の gem コマンドはどこにありますか?

    3. vm.overcommit_ratio の残りのメモリはどこに行くのですか?

    1. フォーク爆弾はどのように機能しますか?

    2. デフォルトのプロセス作成メカニズムフォークはなぜですか?

    3. Linux:スワップ ファイルを配置する場所

    1. Rmコマンドが発行されたときにファイルはどこに移動しますか?

    2. Unzipは、ZipファイルがZip爆弾であると考えていますか?

    3. Glimpse –GIMPのフォーク