カーネルが停電を記録します。

カーネルが停電を記録します。

ロガーでランダムな停電を記録できるかどうか疑問に思います。当然電源が切れた時の時間記録はありませんが、停電後再起動時に停電が発生した時点を知る方法がありますか?私はRed Hat(そして通常Linux)がかなり良いロギング(/var/log)を持っていることを知っていますが、停電を処理するための基本的なロギング手順はないと思います。

ロギングプログラムがない場合に起動スクリプトを変更する方法についても議論しています。 BIOSは常に電源が入るように設定されているため、停電が発生すると自動的に再起動します。

システムは停電が発生した場合にのみシャットダウンされ、手動でシャットダウンされません。

mailだから最初に起動した後、起動するたびに停電が表示されるので、起動スクリプトに何か(簡単なコマンド)を追加するつもりです。残念ながら、私はそのようなコマンドのファイルや場所、実際の構文が何であるかわかりません。

答え1

停電後に再起動時に停電が発生したかどうかを確認する方法はありますか?

SMBIOSのDMI「ウェイクアップタイプ」を参照してください。

$ sudo dmidecode | fgrep 'Wake-up Type'
    Wake-up Type: AC Power Restored

/sys/fireware/dmi/entries/1-0/... を使用してプログラムでこの情報を取得できます。

答え2

再起動は、以下を使用してシステムのsyslogに書き込まれます。システム(例:RHEL 7、Fedora)。以下で見つけることができます。

# journalctl --list-boots
[..]
0 51545e9739db4eb1ab602dd338a937b1 Wed 2014-08-06 10:58:04 CEST—Mon 2014-08-18 22:31:43 CEST

通常、再起動はwtmpを介しても記録されます。つまり、last次のように表示できます。

# last
[..]
reboot   system boot  3.11.10-301.fc20 Wed Jun  4 08:15 - 18:43  (10:27)

(Fedora 20システムの出力)

Ubuntuのマニュアルページでは、lastこのメカニズムについて説明します。

   The pseudo user reboot logs in each time the system is rebooted.   Thus
   last  reboot will show a log of all reboots since the log file was cre‐
   ated.

(ディストリビューションによっては、長時間の稼働時間中に wtmp ファイルが回転し、最後の再起動情報が表示されない場合があります.)

再起動通知を受け取るには、cronジョブを介して間接的に設定できます。たとえば、次のようになります。

#!/bin/bash
set -e
set -u
uptime=$(awk '{print $1}' /proc/uptime)
if [ -f /var/tmp/last_uptime ]; then
  last_uptime=$(cat /var/tmp/last_uptime)
  if [ $uptime -lt $last_uptime ]; then
    echo System was rebooted
    exit 1
  fi
fi
echo $uptime > /var/tmp/last_uptime

あるいは、起動プロセス中にmailコマンドを実行することもできます。それでsystemdあなたはできます:

# echo 'echo Just rebooted at $(date) | mail juser@example' >> /etc/rc.d/rc.local
# chmod 755 /etc/rc.d/rc.local

systemd以外のディストリビューションを使用すると、/etc/rc.local起動シーケンスが終了したときに実行される可能性があります。

関連情報