質問
私はLinux用のシステム・モニターを書いて、いくつかのウォッチドッグ機能を含めたいのです。カーネルでは、あなたはは/ dev /ウォッチドッグが閉じている場合でも、続けるために、ウォッチドッグを設定することができます。私のデーモンが正常に終了すると/ dev /ウォッチドッグを閉じた場合は、他の言葉では、システムがまだ再起動でしょう59秒後。これは、ユーザにとって望ましい行動であってもなくてもよい。
私はSIGINTを処理する方法、それが影響しますので、この設定の私のデーモンに認識させる必要があります。設定が上にある場合は、私のデーモンは、(好ましくは)終了時に正常なシャットダウンを開始するか、(少なくとも)システムがすぐに再起動しようとしていることをユーザーに警告します。
する必要があるだろう誰もがユーザ空間から、この設定を取得する方法を知っていますか?私は値を取得するには)(にsysconfに何も表示されません。ソフトウェアウォッチドッグがで始まるように有効になっている場合は同様に、私が言うことができるようにする必要があります。
の編集の
Linuxは非常にシンプルなウォッチドッグ・インタフェースを提供します。プロセスでは、/ dev /ウォッチドッグを開くことができ、デバイスがオープンされると、カーネルは60を開始します第二いくつかのデータがセット再クロック、その場合には、そのファイルに書き込まれない限り、再起動するようにカウントダウンます。
カーネルの構成方法によっては、そのファイルを閉じてか、カウントダウンを停止しない場合があります。ドキュメントから:
ウォッチドッグがなくて停止することができます デバイスあれば再起動を引き起こします / dev /ウォッチドッグが正しく閉じられています、 カーネルはしてコンパイルされていない限り、 CONFIG_WATCHDOG_NOWAYOUTオプション 有効になってます。
私は違ったデーモンのシャットダウンを扱うことができるようにCONFIG_WATCHDOG_NOWAYOUTは、ユーザ空間のデーモンの中から設定された場合は伝えることができるようにする必要があります。言い換えれば、その設定が高い場合は、シンプルます:
# /etc/init.d/mydaemon stop
...何ももはやの/ dev /ウォッチドッグに書き込みを行っていないので、59秒でシステムを再起動します。そのセット高いのであれば、SIGINTのための私のハンドラは、追加のもの(すなわち、少なくともユーザーに警告)を行う必要があります。
私は、ユーザ空間から、この設定を取得する方法を見つけることができません:(すべてのヘルプは高く評価されます。
解決
AHA!カーネルのlinux/watchdog.h
とdrivers/watchdog/softdog.c
を掘り後、私はsoftdogのioctl()
インターフェイスの能力を決定することができました。それはstruct watchdog_info
に発表能力を見てます:
static struct watchdog_info ident = {
.options = WDIOF_SETTIMEOUT |
WDIOF_KEEPALIVEPING |
WDIOF_MAGICCLOSE,
.firmware_version = 0,
.identity = "Software Watchdog",
};
これは の(ように見える)というマジッククローズをサポートしていないオーバーライドCONFIG_WATCHDOG_NOWAYOUT
。だから、通常の終了時に、私は/dev/watchdog
するために、単一の文字「V」を記述する必要がある[そしてのそれを閉じ、タイマーがカウントを停止します。
ioctl()
を尋ねる/dev/watchdog
するファイルディスクリプタ上の簡単なWDIOC_GETSUPPORT
は、このフラグが設定されている場合は、1つは決定することができます。擬似コード:
int fd;
struct watchdog_info info;
fd = open("/dev/watchdog", O_WRONLY);
if (fd == -1) {
perror("open");
// abort, timer did not start - no additional concerns
}
if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
perror("ioctl");
// abort, but you probably started the timer! See below.
}
if (WDIOF_MAGICCLOSE & info.options) {
printf("Watchdog supports magic close char\n");
// You have started the timer here! Handle that appropriately.
}
ハードウェアウォッチドッグで作業する場合、、あなたはO_NONBLOCK
(したがって忙しいカードを検出)ブロックをioctl()
ないようopen()
で開きたいかもしれません。
WDIOF_MAGICCLOSE
がサポートされていない場合は、は、1だけでソフトウォッチドッグはNOWAYOUTで構成されていることを前提とすべきです。ただの開口部のデバイスが正常にカウントダウンを開始し、覚えておいてください。あなたがやっているすべては、それは魔法の近くをサポートしており、それがないかどうかを確認するために、プロービングされている場合は、の魔法はのそれを閉じます。そうでなければ、あなたは今、実行中のウォッチドッグを持っているという事実に対処するようにしてくださいます。
残念ながら、実際には少なくともない私は見つけることができること、それを起動せずに確実に知るためには実際の方法はありません。
他のヒント
ハードロックシステムに対して、どちらかのためにソフトウェアのクラッシュ、またはハードウェア障害のウォッチドッグガードを。
何が必要デーモンの監視デーモン(DMD)です。 'MONIT' をご確認ください。
私は、開発者はカーネルが使用されているかのコントロールを持つことになりますどこウォッチドッグ・デバイス・ドライバーが本当に組み込みプラットフォーム(または少なくとも十分に制御されたもの)で使用することを意図していると思います。
これは見落としであるとみなすことができ、私はそれがないと思います。
ウォッチドッグが、それはおそらく、シャットダウンを中止しますアンロード、ロード可能なモジュールとして構築された場合は、もうひとつ、あなたは、試みることができる?