2011-04-08 明日・明後日休みだー!
ひゃっほーい♪
◆ [日記][tDiary][FreeBSD][Ruby] また日記(ここ)がDDoS受けた
「この方法まずいかなー」で対処したら見事にまずかったので、色々引き下げて再起動。
この休み中にパッチ作るか。
→とりあえず、Apacheでいじればいいと思われる箇所は発見したが、リコンパイルめんどくさいのと、特定条件下で無限ループ状態に陥ることが判明した(==;)ので、tDiary側にも変更を加えた。
具体的には、RLimitNProc(RLIMIT_NPROC)で制限かかってる時に、IO.popen使うと無限ループに陥る。
Linuxの場合は分からないが、FreeBSD+Apache+suexecの場合、RLimitNProcで制限加えても、とりあえずスクリプトの実行までは行ってしまうのです(まぁsuexecがrootで実行されるからしゃーないが)。で、その状態でIO.popenで新しいプロセスを立ち上げようとすると、forkが失敗してしまうのです(ちなみにFreeBSDの場合、Apacheから起動されたプロセス数じゃなくて、システム全体のプロセス数とRLIMIT_NPROCが比較されます)
で、fork失敗した時には-1が返り、errnoにはEAGAINが設定されます(On-line Manual of "fork")
で、だ。
なんで戻ってこないねん! って思って、rubyのソースコード見てみたわけですよ。
retry:
switch ((pid = fork())) {
(中略)
case -1:/* fork failed */
if (errno == EAGAIN) {
rb_thread_sleep(1);
goto retry;
}
(後略)
fork失敗して、errnoがEAGAINだったら、rb_thread_sleep(1);をコールした後、goto retry。で、retryってforkの前の行にあるので、またforkしに行って……あぁ、名前的にはrb_thread_sleepは1秒現在のスレッドお休みだろうから、1秒ごとにfork失敗して無限ループになってるのね(笑)
そりゃ無限ループするわ(笑)
というわけで、timeoutを使って特定時間反応がなかったら死ぬようにしました。こんな感じ。
class IKTimeoutException < Exception; end
begin
require 'timeout'
cgi_exec_count = 0
begin
timeout(2) do
IO.popen("/bin/pgrep -G グループID -U ユーザID -f -x '/usr/local/bin/ruby 日記のスクリプトファイル名'",'r'){ |io|
io.each_line { |l|
cgi_exec_count += 1
}
}
end
rescue Timeout::Error
raise IKTimeoutException
end
if cgi_exec_count > 最大プロセス数 then
raise IKTimeoutException # めんどくさいので同じロジックへ飛ばす
end
rescue IKTimeoutException
print "Status: 503 Service Unavailable\n"
print "Content-Type: text/text\n\n"
print "503 Service Unavailable\n"
exit
rescue
print "Status: 500 Internal Server Error\n"
print "Content-Type: text/text\n\n"
print "500 Internal Server Error\n"
exit
end
本当は/bin/pgrepが実行できなかったら即ジャンプするようにしたいのだが、rubyのソース読んでる限りなんか無理っぽいので2秒の執行猶予を持たせて、その間に実行終わらなければ終了するように変更。
とりあえずはこれで一旦しのげるかな。
……明日・明後日で時間あれば、Apacheのソースいじって必要数以上のCGIがそもそも起動しないように書き換えます……。パッチは公開予定。
上のソース見れば分かりますが、timeout設定無しだと、Apacheが落としてくれない限りCGIが立ち上がりっぱなしになります(forkから先へ進まない)が、アクセスあるたびにCGIは実行される(プロセス数が減らない)ので、固まってるよーな状態のままになります(^^; てか、なってました(笑)
rubyから別プロセス立ち上げずにシステムの全プロセスデータ抽出する方法が欲しい!
……CでCGIのラッパーを書けば出来ますが(最初にpgrepとおなじよーなコードを実行後、rubyスクリプトをexecすればok)それも微妙なのですよねぇ。あぁ、でもApacheのパッチ作る時にどうせ似たよーなコードが必要になるから、もしかしたら作るかも(笑)
◆ [巡回] 「東日本大震災チャリティ同人誌の表紙どんぼ側」/「こげどんぼ*」のイラスト [pixiv]
おおおおおおおお………
◆ [情報] 地上デジタル放送への完全移行が延期される方針、震災の影響でアンテナ施設などが損壊
一部地域だけ……!?
◆ [情報] 「無用の長物」と化す ソフトバンク携帯震災が暴いた「儲け至上主義」
ソフバンの繋がらなさは異常。
◆ [情報] 【電凸あり】 日本赤十字社への義援金がたった1日で300億ほどピンハネ?
今の政府が絡んだ時点で……。
関連:官邸HP、3/12の原発のベント開始時間を4時間余り早めて経過録を書き換え
自らデマを流すなよ……
◆ [情報] 東京電力、計画停電打ち切り 政府、夏も「原則実施しない」方針
突発的な需要の増大でやむを得ず計画停電を実施することもありうる
それが一番困るんじゃぁぁぁぁーーーー!!!!
せめて2時間前には告知してくれ(IT業界の場合)
製造業だと本気で死ねるかも。
◆ [ネタ] 【魔法少女まどか☆マギカ】僕と契約して劇場公開してよ!【劇場予告編】 ‐ ニコニコ動画(原宿)がランキング1位……が、権利者削除。
この動画は株式会社エスエムイーレコーズの申立により、著作権侵害として削除されました。
対象物: コネクト_audio file
あ、ほんとだ。原曲使ってる。
……★「コネクト」歌ってみました Ver-irony ‐ ニコニコ動画(原宿)に置き換えかな?
◆ [ネタ] 更に闘う日常 ‐ ニコニコ動画(原宿)
まだ1話しか来てないのに早いよ!!!www
◆ [ネタ] 『まどか☆マギカ』当初マミさんの必殺技の名前は「アルティマシュート(笑)」
えぇー……
関連:『まどか☆マギカ』 虚淵「今は必死に 次 の "まどか"の展開を考えている所です」 これは2期フラグ!!
お!?
関連:『まどか☆マギカ』ホストの会話は虚淵氏が実際に電車で聞いた実話、そしてさやかはホストは殺してない
アニメ版「殺してない」
漫画版「殺した」
どっちやねんw
◆ [ネタ] 4/11付 アニメDVD/BDウィークリー 『フリージング』は約5700枚、そしてイカ娘とミルキィ復活
相変わらずトトロが……
◆ [ネタ] 原作『俺の妹がこんなに可愛いわけがない』最新8巻の表紙絵とあらすじキタ━(゜∀゜)━!! 色々修羅場すぎるwww
超wktkして待つ!
◆ [ネタ] 「俺たちに翼はない」第1話に「僕は友達が少ない」が出ていた
これは見つけた人凄い。
◆ [ネタ] ニコニコ動画での2011年春の新作アニメ配信に4タイトル追加
「よんでますよ、アザゼルさん。」「まりあ†ほりっく あらいぶ」「星空へ架かる橋」「俺たちに翼はない」
まりほりキタ━━━━(゜∀゜)━━━━!!
……と思ったら
【料金】:第1話無料、2話以降有料
orz
◆ [ネタ][情報] Linux Foundation エグゼクティブ・ディレクターの強気発言、マイクロソフトはもはや敵ではない
うまいこと色んな会社に利益分散できて良いんじゃないでしょうかね。
あと、サーバ分野では、管理コンソールがWindowsで、下についてるサーバ群がLinuxってパターンも結構あったりする。
◆ [情報] 1号機 震災の夜に燃料露出直前
NHKが入手した資料には、地震当日の先月11日に福島第一原発の1号機から3号機で測定された原子炉の「水の高さ」や「圧力」などの値が示されていますが、東京電力などは、これまで地震の翌日以降の値しか公表してきませんでした。
なにこのあからさまな情報隠し……。
「報道機関に言われたから出した。隠していたように言われるのは心外」と説明
あほかぁぁぁぁぁぁぁぁーーーーーーー!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!