
フォーク爆弾の効果をテストするためにテストVMを設定しました。そのため、ユーザーのためにlimits.conf
次のように編集しました。root
root hard nproc 512
次に、次のようにフォーク爆弾を落とします。
:(){ :|:& };:
その後、しばらくして(512制限に達する必要があると思います)、次のエラーが発生します。
これは継続して行われます。コンピュータを再起動せずに停止する方法はありますか?
答え1
コンピュータを再起動せずに停止する方法はありますか?
完全に不可能ではありません。運がよければできます。つまり、他のプロセスが作成される前にすべてのプロセスを終了できます。1 しかし、あなたは非常に幸運でなければならないので、それは信頼できる価値のある努力ではありません。[おそらくslmが私より運が良いかもしれない、ハハ - 正直、まだそんなに頑張っていない]。優先順位付け(参考資料を参照)について考えると、可能性が高くなることがありますが、man nice
これがフォーク爆弾の効果にも影響を与えると考えられます。
より良いアイデアは、タイムアウトアプローチを使用することです。 Cの例については、脚注5を参照してください。私の答えはここにあります。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
方法(設定を介して)は通常ほとんど機能しませんが、試してみることができます。そうではありません。今はシステムを実行し続けたいからです。 ;)
答え2
この質問に対する答えを定式化しながら、タイトルは次のとおりです。フォーク爆弾のフォーク()はどこにありますか:(){ :|: & };:?、私はより簡単に殺すためにヒューズ遅延フォーク爆弾と呼ぶことを構成しました。
また、この回答の開発中にすべてのプロセスを終了してフォーク爆弾を防ぐことができたことが多かったです。予想していたよりも簡単で繰り返し可能でした。
使用説明書
この回答を書いてからかなり時間が経っているので、今は100%確信できませんが、次のようなアプローチを使っていると思いました。
$ pkill -f :
プロセスを待っている間はしばらく停止しますが、最終的には実行できます。また、フォーク爆弾を実行する前に親プロセスIDを記録し、次のことを行います。
$ pkill -P <PPID>
これはフォーク爆弾が実行される親プロセスID(PPID)です。この方法は、すべての子プロセスを終了し、すべてカスケードに進み、終了します。
答え3
私はあなたが答えの提案に従うことができると信じていますここシェルにアクセスできるとします。
killall -STOP -u user1
killall -KILL -u user1