web-dev-qa-db-ja.com

Fork Bombのメモリ不足エラーを停止する方法-RHEL 6

フォーク爆弾の効果をテストするためにtest VMを設定しました。したがって、rootユーザー用にlimits.confを次のように編集しました:

root    hard         nproc  512

今私はフォーク爆弾を次のように落とします:

:(){ :|:& };:

この後、しばらくすると(512の制限に達するまでにかかると思います)、次のエラーが表示されます。 example

これは止まることなく続きます。とにかく、マシンを再起動せずにこれを停止する方法はありますか?

7
rahuL

とにかく、マシンを再起動せずにこれを停止する方法はありますか?

それは完全に不可能ではありません、そしてあなたは幸運でそれを行うことができます-つまり、あなたは別のプロセスがスポーンされる前にすべてのプロセスを殺すことに成功しました。1 しかし、あなたは非常に幸運でなければならないので、それは信頼できるまたは価値のある努力ではありません[おそらく、slmは私よりも幸運です、lol-TBH I頑張っていません]優先順位をいじってみれば、チャンスが向上する可能性があります(_man Nice_を参照)。これもフォークの効果を台無しにするのではないかと思います。爆弾。

タイムアウトになるものを使用することをお勧めします。 Cの例については、脚注番号5の my my here here を参照してください。2:(){ :|:& };:ほど短くはありませんが、シェルスクリプトでも同じことができます。

_#!/bin/bash

export fbomb_duration=$1
export fbomb_start=$(date +%s)

go () {
    now=$(date +%s)
    if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
        then exit 0;
    fi
    go &
}

while ((1)); do
    go
done           
_

1つの引数を秒数で実行します。すべてのフォークはその時間後に死んでしまいます。

1 実際、カーネルのOOMキラーが運が良ければ、結局はそれだけで起こります。しかし、息を止めないでください。

2 その特定の爆弾をハムストリングにするためにそこで使用されるメソッド(_vm.overcommit_memory=2_を設定することによって)は、ほぼ確実に一般的に機能しませんが、試すことができます。私は今のところシステムを実行したままにしたいので、そうではありません;)

3
goldilocks

フォーク爆弾のfork()はどこにありますか:(){:|:&};:? 、この質問の回答を作成しているときに、私はFuse遅延フォークと呼ばれるものをまとめました爆弾、それは殺しやすかった。

さらに、その回答を作成している間、私はすべてのプロセスを終了することによってフォーク爆弾を定期的に停止することができました。思ったよりも簡単で再現性が高かった。

使用した方法

私がその答えを書いてからしばらく経ったので、100%確実ではありませんが、頭のてっぺんからこの方法を使用していたと思います。

$ pkill -f :

プロセスを待つために少しストールしましたが、最終的には実行できました。また、フォーク爆弾を開始する前に親プロセスIDをメモして、これも行います。

$ pkill -P <PPID>

これは、フォーク爆弾が実行された親プロセスID(PPID)です。その方法では、すべての子プロセスが停止し、すべての子プロセスがカスケードして終了します。

3
slm

私はあなたがシェルへのアクセス権を持っていると仮定して、 here からの回答で示唆されているようにできると信じています。

killall -STOP -u user1
killall -KILL -u user1
2
Ramesh