フォークボムの後に掃除する最良の方法は何ですか?


21
$ ls
bash: no more processes

ええとああ。誰かがフォーク爆弾を作ったように見えます。私が以前働いていた場所では、これは共有サーバーの電源を入れ直す必要があることを意味していました。多くの場合、彼らはプロンプトを取得することさえできませんでした。

いくつかのトリックを聞いたことがあります(特に、KILLシグナルではなくSTOPシグナルを送信します。後者は、残りのスレッドが殺されたスレッドをすぐに置き換えることができるためです)が、So、You Have Yourselfフォークボム?

作りましょう。

回答:


10

ulimitを使用して、ユーザーごとの合理的なプロセス制限で、フォーク爆弾がプロセス制限を使い果たすのを防ぎます。

これにより、システムの制限に達するよりもずっと前に、1人のユーザーがプロセスクォータを使い果たしてしまいます。


6

最初に試すことは、ログインしているユーザーをログアウトさせることです。それらのシェルがすべての分岐を行うプロセスの親プロセスである可能性があり、それが問題を終了させる可能性があります。

それでもうまくいかない場合はkill -STOP -2、rootとして実行して、root以外のユーザーとして実行されているすべてのプロセスをフリーズしてみてください。それが機能する場合はkill -CONT <pid>、フォーク爆弾とは関係のない既知のプロセスをフリーズ解除してそれらを強制終了し、プロセステーブルの問題を完全に排除して、問題の元の原因を突き止めて強制終了するための余裕を与えます。Sendmailは、.pidファイルを使用してpidを識別することで簡単に識別できるため、強制終了するシステムプロセスの良い例です。たとえば、kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid)


どのOSにkillの「-2」オプションがありますか?Linuxのmanページには表示されません。
raldi 08年

1
pidに負の値を指定しているため、これはほとんどのOSで機能するはずです。<pid>が-1未満の場合、killはプロセスグループ-<pid>内のすべてのプロセスに送信されます。STOPのsigをpid -2に送信すると、特別なシステムプロセスまたはルート所有プロセスではないすべてのプロセスが停止します。

「負のpid」を殺すには、kill(2)のマンページを参照してください。しかし、まだこれが機能するとは思わない。すべての非初期化プロセスがグループ2にあるのはなぜですか?私は...それを止めるの結果は、しばしば非常に致命的なので、あなたが初期化を避けるしたいことを理解し、しかし
ephemient

@ ephemient、2はプロセスグループIDには低すぎるため、別の特別な値になる可能性があります。
-joshudson


3

スポーンにkillは使用可能なプロセスハンドルが必要になるため、STOPシグナルを送信する方法もわかりません。その上、私の経験では、システムは過負荷になり、プロセスが不足するずっと前に使用できなくなります。

単純にユーザーごとのプロセス制限を実施することを検討しましたulimitか?これにより、ユーザーがフォーク爆弾を発射するのを防ぐことができます(偶然)


3
killは、少なくともbashに組み込まれたシェルです。
raldi 08年

1
これが重要なコンポーネントだと思います-選択したシェルのビルトインを特定します。

2
ビルトインではない場合、「exec kill PID」を実行できますが、これはフォークしません。しかし、それが機能しない場合は、別のシェルを取得できない可能性があるため、危険です。システム管理へのハチ刺されたアプローチと考えてください!
スティーブンダーリントン

2

一部のBSDシステムには、ルート用に最後の5個ほどのプロセスを予約する機能があります。システムにその能力があるのか​​もしれません。


3
これを行うためにシステムを実際にどのように構成しますか?
ニックレイマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.