monitを調べてみたがシステムがビジー状態の時リブートするようなことをするのがどうやっていいかわからなかった、もしかしたらこういう機能はないのかもしれない、ので、自作してみることにした。
このプログラムはcronで定期的に動かして、システムがビジー状態だったらリブートする。ビジー状態の判定は、/proc/loadavgを見ればいいと思う。そこで、C言語で以下のプログラムを作ってみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <stdio.h> #include <unistd.h> int main(int argc, char* argv[]) { float avr = 0; float tmp = 0; int fret; FILE* f = fopen("/proc/loadavg", "r"); fret = fscanf(f, "%f %f",&tmp, &avr); if(fret != 2) { perror("fscanf unmatched"); } fclose(f); if(avr > 20) { char command[] = "/sbin/reboot"; char *exargv[] = {"/sbin/reboot", NULL}; char *exenvp[] = {NULL}; execve(command, exargv, exenvp); perror("Could not execute command"); } return 0; } |
/proc/loadavgの出力は左から、1分、5分、15分の平均負荷なので5分後をみて、それが20を越えていたらリブートするようにした。20は適当に決めたので、これくらいでいいのかはよく分からない。リブートは/sbin/rebootを直接実行するようにした。
コンパイル
1 |
$ gcc -o busyrebooter main.c |
/sbin/rebootはルートしか実行できないので、ルートで実行しないとならない。
あとはこれをcronに登録する。/etc/crontabを編集して以下の一行を加えた。
1 |
*/10 * * * * root [ -x /root/bin/busyrebooter ] && /root/bin/busyrebooter |
ログとかは全然とってないので、ちゃんと動いているのか調べられない。あとで直したい。