CGI暴走はどういう時に起きるのですか?
よくCGIは暴走したら大変だから
必ずローカル環境で確かめてましょうなどと言われますが
未だにテストしていて暴走など起きたことありません。
そもそも本当に暴走によるサーバダウンなんて起きるのでしょうか?
とりあえず「whileなどに因る無限ループ」というのは聞きますが
逆に言えば原因としてこれしか聞いたことないです。
じゃあこれさえ気をつければOKでしょうか??? 配列に巨大な添字を指定、とか。
ローカルで、配列に間違えてハッシュのリファレンスを指定したらフリーズした。
(^Cで停止はできるけど)
糞スレ立てるような自信過剰な奴が共用サーバを借りたときに起きます >>1
CGIだからです。
OSにたとえると、Win9x系のレベルだからです。 たかが1人のユーザのページが暴走したぐらいで落ちる
ような鯖は管理が甘いんじゃないのか?
一定割合以上CPUが使えないようにするとか、ある転送量
以上になるとサービスが停止するとか、あらかじめ規制し
とけば、暴走CGIを実行されてもそいつのサイトが落ちる
だけで、鯖自体は痛くも痒くもないだろう。
そんな甘い鯖なら、中には意図的に暴走するようにして
鯖を落とそうとするやつもいるだろうし、鍵のない家に
住んでて泥棒に入られたというような話やね。 >>12
に通じるけど、そもそも、タイムアウトしないの? マジレスすると、
#!/usr/bin/perl
fork while 1;
__END__
この程度でダメージ喰らうサーバーは結構ある。 >>16
俺もそれ不思議。
perl使ったことないから知らんのよ。 >20
落ちるってhttpdが無限ループで何しても反応しなくなるってこと?
で、http全体を巻き込んで落ちるの?
それともOSが落ちるの?<そんなことないよね?? >>21
昔のパソコンならありそうだけど、ふつうサーバー用OSでは
httpdが落ちたりOSが落ちたりはまずありえない。
で、Cなんかで書かれた物でメモリ管理が間違ってる(甘い以前の問題)
物はよくCore吐いてプロセスが落ちたりするけど、
Perlだとメモリ管理自体をperlが行うから相当雑なスクリプティングでも
プロセスが落ちるところまでは滅多に行かない。
#!/usr/bin/perl
$a .= "0123456789abcdef" x 65536 while 1;
まぁこのくらいやっとけば起動後しばらくして使用可能なメモリ使い切って
プロセス自体は落ちると思うけど、サーバーには影響ないと思われる。 まずPerl自体がメモリ管理というかOSとの連携が甘いと思う。
HTTPDですぐに幽霊プロスセ作るバカチン(このスレの傾向だとANとかが多
い)だとどんどん未解放領域が増えてしまいにHttpdに泣きつく。
で、自分だけでも手一杯なHttpdはOS叩いて共倒れ。
Winだとまずデスクトップ画像が更新されなくなる(メッセージの不通達)から
Explorerが落ちる。次にPerlが落ちる。で、Httpdがメモリアドレス違反〜がで
て鯖が死ぬ。
とにかくPerlのメモリ管理を意識してやる事かな。俺はPHPに乗り換えてましに
なったけど >>23
なんか・・・・すごく適当なことをいい加減に書いてないか? >>24
レスしちゃ駄目です。NGワードにしてください。荒しなので あっ私も、1と同じ事を聞きたかったです。
改造のプロの私には、CGIの暴走の
意味が分かりません。 >>1
>>32
仕事で8年CGIスクリプトを書いてるけど、ローカルでテストなんかしたことないです。
都市伝説みたいなもんでしょう。
> 暴走によるサーバダウンなんて起きるのでしょうか?
サーバーがsystem7とかWindows95とかだったらあるかも知れない。 ダウンしなくても過負荷によるアカウント停止ってのはあるわな >>38
httpdやOS側で実行時間に制限をかける。
無限ループが起きそうな場所の前後でalarm()を呼ぶ。
>>39
スクリプト側でハンドリングされたら意味無しなので、
-TERMや-INTで様子みて、駄目なら-KILLを送るのが確実かと。 >40
それって手動で解除ってことですか?
それとも、httpとかでの設定すれば自動的にタイムアウトにできるんですか? >>41
> それって手動で解除ってことですか?
killは手動解除。alarm()は、プロセルが特定のルーチンに一定時間以上とどまっている場合
(大抵ブロックか無限ループ)に、プロセス自身に自殺させる(あるいは何らかの措置を取らせる)
ことができる。perldoc -f alarm参照(システムコールを直に呼ぶならman 3 alarm)。
> それとも、httpとかでの設定すれば自動的にタイムアウトにできるんですか?
httpじゃなくてhttpdね。お使いのhttpdのマニュアルを読んでみてください。 >43
無限ループにはまっても、書き方によってスクリプト自身で自殺する
(タイムアウトできる)ことができるってことですね。サンクス!!
>httpd
すんません、気をつけて書きます。 >>43
No entry for alarm in section 3 of the manual
システムコールなんだからセクション2だろ >>43
alarmがどういうものなのか、勘違いさせそうな説明だな。
いや、43はきちんと理解しているんだろうけど。 >>439
性的責任能力のない人間とのセックスに関する「同意」は無効という話なんですが。
少なくともこの国では13歳未満とセックスすると無条件でレイプ。
>>440
だから親告する権利は親にあるんだってば。親に知られなきゃおっけーってのは
「ばれなきゃおっけー」と等価でしょ? >>439
性的責任能力のない人間とのセックスに関する「同意」は無効という話なんですが。
少なくともこの国では13歳未満とセックスすると無条件でレイプ。
>>440
だから親告する権利は親にあるんだってば。親に知られなきゃおっけーってのは
「ばれなきゃおっけー」と等価でしょ? >>439-440
よぉ〜く話聞いておけよ!
>>47が、2度も言ってくれてるんだぞ!
2度言う必要があるのかわからないが、
でも、2度も同じ事を言ってくれてるんだぞ!
早くロリコンを治すことたな。
Apache1.3.27を直接編集して
実行時間に制限を書ける方法ってあるのですか? >>50
mod_perlのことかと思ったがそうでもなさそうだな
httpdがCGIを実行するわけじゃないぞ? >>53
httpdがforkしてperlなんかをexecするんだから、子プロセスに
シグナルを送ることは可能なのでは?
子プロセス側で fork and fork and exitとかされると
打つ手なしっぽいけど。 >>54
可能だろうけど発想的に実行時間の制限をhttod側から設けるってするかね? >>55
某プロバイダで働いてた時に検討対象になったことある。結局やんなかったけど。daemon化されて
initに引き取られたら意味ないし。
結局プロセス監視daemon走らせて、nobodyで居着いてる奴に片っ端から9番投げて殺すことになったハズ。 >>55
UNIX+ApacheならRLimitCPUでできる。
他にメモリの使用量を制限するRLimitMEMもある。
サーバを貸すなら設定しておくべき。
42では無視されちゃったよ・・・ >>58
SIGKILLでterminateする以外止める方法ないだろ(w
本7の無限ループ:
持ってる限りの知識をひけらかす → いい加減な知識しかないので馬鹿にされる ┐
↑ ↓
└ 汚名挽回するには頭がいい所を見せないと ← 自分は賢いと思っているので不本意 >>59
その持ってる限りの知識でさえ、パクリだったりする訳で…。