- ベストアンサー
無限ループをkill
無限ループが実行された時、サーバー上で、自動的にkillするには、どういう設定をしたらよいでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
次に、sokuさんが、そのサーバーの管理者(root)であるとして説明します。 通常でしたら、ps の出力で、無限ループしているかというのは CPU実行時間等で確認できるのですが、 それ以外のも、uptime コマンドの数字で知ることができます。 uptimeコマンドで出力される Load avagage が、ある一定以上のあたいになるということは 大概、何かのスクリプトが暴走しているという可能性が大きいです。 そこで、Load avagage が一定の数字を超えているのを確認できれば Apache 自体を再起動してしまえば、安全に暴走プロセスを 停止させることができます。
その他の回答 (4)
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
sokuさんが、そのサーバーの管理者でないとして説明します。 まず、現在CGIのスクリプトを作成中で、手動でkillする 場合においては次の方法でkill することができます。 (もちろん、nobody権限等で実効されてるとして・・) BIGLOBE と CGIで遊ぼう!というページにいき http://www2d.biglobe.ne.jp/~gama/cgi/index.cgi telnet.cgi をダウンロードします。 このCGIを開き、 ps -ax もしくは、ps -e (OSによって異なります)を 実効し、自分が無限ループさせてしまったCGIであるか 探します。 そしたら、そのものを、kill します。 ------------ もうひとつの方法は、ダミーCGIを用いて半自動的?killする方法です。 ページの下のほうに、<IMG SRC=ダミー.cgi height=2 width=2> と記述し そのダミーCGIは、上記 ps ax もしくは ps -e で実行 し、そこから、自分が動かしているCGIであるものを フィルタリングし、プロセス番号をkillする方法です。 この場合は、CGIの名前を「自分独特」のものにし 他人と区別つけられるようでなければなりません。 そうすると、そのダミーCGI自体は nobody 権限で動作し かつ、無限ループされているのも nobody 権限で動作 しているので、kill できるというわけです。 詳しい方法がお知りになりたければ、ホソクを付けて下さい。
ちなみにCGIの実行はプロバイダやサーバ管理者に よって、実行者の設定が異なります。 実行者が、CGI作成者(ようするにあなた)やrootの 場合はPerlプログラム側からでもkillコマンドが発行 出来ますが、nobodyでの実行の場合、root以外 killコマンドを発行してもプロセスを削除することが 出来ません。 #私は何度かnobody実行で管理者様にご迷惑を #かけたことがあります。 ではでは☆
- nihonrisu
- ベストアンサー率25% (9/35)
無限ループの判断自体が難しいため、サーバで自動的に回収することは、できないと思います。 サーバ上で動作する専用の監視プロセスを作成すれば可能なのかもしれませんが・・・ 無限ループの定義を、Kanataさんの回答にあるように、一定時間内に処理が終了しない場合と定義します。そして、監視対象プロセスの中で、一定時間終了しないプロセスを、自作監視プロセスにより、Killシグナルで強制終了させるような感じですが、危険です。 ご質問の主旨と異なっていましたらごめんなさい。
私の知りうる限りでは、無理だと思いますよ。 無限ループということは、プロセスの実行時間を 管理して、ある一定時間以上プロセスが終了しない 時は、killコマンドを発行して、しかもdaemonの ような常駐プロセスは一定時間が経過しても 終了させない。 それを判断するのはそうたやすいことではないので あきらめてkillコマンドを手動で発行するのが一番 だと思います。 #自分が管理者でないのならば、管理者に連絡する #のが早道でしょう。 ではでは☆