ここ最近、サーバが過負荷で処理効率が極端に落ちる現象が多発していました。効率が落ちるだけでサービスを提供してくれるならまだマシなんですが、それを通り越してSSHでログインできないこともしばしば…。家にいれば簡単に再起動できるんですけど、そうじゃなかったら長期間サーバが実質死亡状態で放置されることになってしまいます。
それを回避するために、過負荷で処理できなくなる前にさっさと再起動するようなスクリプトを書いてみました。まずはそのスクリプトを見てみてください。
#!/usr/bin/perl $threshold = 50; open( LOAD_AVERAGE, "</proc/loadavg" ); $value = <LOAD_AVERAGE>; close( LOAD_AVERAGE ); $value =~ s/\..*//; if( $value >= $threshold ) { print "I'm rebooting now!! [load average]$value"; system("reboot"); } exit;
これを、/etc/cron.hourly の中に放り込んで、rootの実行権限を追加すれば出来上がりです。でも、このソースはちょっと間違えるとえらいことになるので取扱注意です。*1
(2007/11/21 追記)
この内容に近い話として、カーネルパニック時に再起動させる方法もあるようです。
[web] カーネルパニック時には自動的に再起動するようにしたい - ITmediaエンタープライズ
(2007/11/21 追記)
ぜんさんから、Shell版のスクリプトを教えてもらいました!ありがとうございます。
#!/bin/sh if (($(sed 's/\..*//' /proc/loadavg) >= 50)) then echo rebooting reboot fi
(2007/10/23 追記)
Perlのスクリプトを単純にしてみました。機能自体はあまり変わらないです。
- *1:例えば、$threshold = 1にするとか。
Comments [2]
ぜんさん
厳密に同じ動きではありませんが、こんなんでどうでしょう?
if (($(sed 's/\..*//' /proc/loadavg) >= 50)); then echo rebooting; reboot; fi
tetsuさん
なるほど?!
まだsedの使い方がよく分ってなかったりするので、
その方がスマートですねヽ(´ー`)ノ
後で訂正しておきます。ありがとうございます。
コメントする