web-dev-qa-db-ja.com

シャットダウンされたメッセージを後で読む方法は?

Lubuntu 11.10を使用しています。シャットダウンするたびに、FAILを赤い文字で読むことができますが、それ以上読むことはできません。

では、ログメッセージを読んで問題を解決する方法を教えてください。

18
Sigur

このデータをファイルに記録する方法がないようです。ブートプロセスには、ファイル/var/log/bootを作成するbootlogdパッケージがありますが、シャットダウン/再起動プロセスにはありません。私が見る限り、rsyslogでログを記録する方法もありません。たとえあったとしても、rsyslogが停止した後にメッセージが出力されます。シャットダウン/再起動プロセスの一部は、rootfsを読み取り専用で再マウントし、他のすべてをアンマウントすることです。次の起動時にまだ存在するファイルへのこのロギングは事実上不可能です。

メッセージを確認する最も簡単な方法は、/etc/init.d/haltおよび/etc/init.d/rebootスクリプトを編集して、実際のhalt/rebootの直前で一時停止することです。 haltスクリプトの場合、コマンドsudoedit /etc/init.d/haltを実行して(またはGUIエディターを使用して)、実際に停止する行を探します。私にとってこれは行です:

halt -d -f $netdown $poweroff $hddown

それ以外の場合は、do_stop関数の最後、およびhaltコマンドを呼び出す唯一の行にする必要があります。行が見つかったら、次の行を上に挿入します。

read -p "Press enter to halt" reply

ファイルを保存して終了します。シャットダウンすると、Enterキー(またはCTRL-C、CTRL-Dなど)を押すまでシステムが一時停止します。画面に表示されたメッセージを読むことができます。 1画面以上のテキストがある場合は、Shift+PgUpを押すとターミナルのスクロールバックが表示されます。それでも不十分な場合は、スクロールバックバッファーのサイズを増やす方法があります(おそらく別の質問です)。

システムの再起動時に同じことを行うには、/etc/init.d/rebootファイルを編集する必要があります。ここで使用されるコマンドは、もちろんrebootではなくhaltであり、再びdo_stop関数の最後に置く必要があります。私にとっての行は:

reboot -d -f -i

もう一度、上記の新しい行に以下を挿入します。

read -p "Press enter to reboot" reply

これらのファイルがinitscriptsパッケージのconffilesとしてリストされていることにも注意してください。これらの編集は、パッケージのアップグレード時にデフォルトで破棄されませんが、競合が発生します。


より完全な解決策は、次のスクリプトを使用することです。

#! /bin/sh
### BEGIN INIT INFO
# Provides:          pause_hook
# Required-Start:
# Required-Stop:     halt reboot
# Default-Start:
# Default-Stop:      0 6
# X-Stop-After:      umountroot
# X-Interactive:     true
# Short-Description: Pause before halt or reboot
# Description:
### END INIT INFO

do_stop () {
    [ -r /etc/pause_hook.conf ] && . /etc/pause_hook.conf

    [ "$PAUSE_HOOK_ENABLED" = true ] && read -p "Press enter to continue" reply
}

case "$1" in
    start)
        # No-op
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        do_stop
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

これは/etc/init.d/pause_hookに配置する必要があり、次のコマンドでシャットダウン/再起動時に実行できるようにすることができます。

Sudo update-rc.d pause_hook defaults

次に実際のフックを有効にするには、次の行を含む/etc/pause_hook.confファイルを作成します。

PAUSE_HOOK_ENABLED=true

シャットダウン/再起動プロセスは、haltまたはrebootスクリプトが呼び出される直前に一時停止し、メッセージを表示する時間を確保する必要があります。 /etc/pause_hook.confのenable行をコメント/コメント解除することで、簡単に無効化/再有効化することもできます。この方法では、アップグレード中にdpkg conffileの競合も発生しません。

14
Graeme

bootlogdが実際にロギングを実行する方法を調べたところ、シャットダウン/再起動プロセスとスタートアッププロセスをログに記録するように説得できることがわかりました。 bootlogdは、ブートプロセスの早い段階で開始されます。次に、ttyおよびptsデバイスを使用して、すべての出力を接続先の端末に記録します。その後、おそらくttyで作業しているユーザーからの出力のロギングを開始する前に、ブートプロセスの後半で停止されます。

シャットダウン/再起動プロセス中にbootlogdが再度起動され、ログを含むファイルシステムがマウント解除される前に停止すると、次回の起動時に使用できるシャットダウンプロセスのほとんどが記録されます。

bootlogdは、2つのinitスクリプトを使用することにより、起動時に起動と停止の両方を管理できます。 1つは通常のinitスクリプトで、通常どおりプロセスを開始/停止します。もう1つは「逆」のinitスクリプトで、startで呼び出されると、最初のスクリプトを停止で呼び出します。これはsysvinitプロセスを「だまし」、実際に同じサービスを開始および停止しているときに2つの別々のサービスを開始しているように見えます。これは、すべてが正しい順序で行われるようにするために必要です。

シャットダウン中にbootlogdを実行するには、以下が必要です。

  1. まだインストールしていない場合は、bootlogdをインストールします。
  2. 2つのinitスクリプトをコピーする
  3. 'reversed'スクリプトの変更を、開始から停止ではなく停止から開始に変更します。
  4. LSBヘッダーを変更して、シャットダウン/再起動中に両方のスクリプトが適切なタイミングで実行されるようにします。
  5. update-rc.dを使用してインストールします。

コピー/貼り付けbashスクリプトとしての私の変更を以下に示します(手動で変更を加えたい場合は、使用したLSBヘッダーがパッチに含まれています)。

cd /etc/init.d
cp bootlogd shutdown-bootlogd
cp stop-bootlogd shutdown-start-bootlogd

echo -e 'diff -ur ./shutdown-bootlogd /etc/init.d/shutdown-bootlogd
--- ./shutdown-bootlogd\t2014-02-20 13:59:23.426109512 +0000
+++ /etc/init.d/shutdown-bootlogd\t2014-02-20 11:10:56.238656828 +0000
@@ -1,14 +1,13 @@
 #! /bin/sh
-### BEGIN INIT INFO
-# Provides:          bootlogd
-# Required-Start:    mountdevsubfs
-# X-Start-Before:    hostname keymap keyboard-setup procps pcmcia hwclock hwclockfirst hdparm hibernate-cleanup lvm2
-# Required-Stop:
-# Default-Start:     S
-# Default-Stop:
-# Short-Description: Start or stop bootlogd.
-# Description:       Starts or stops the bootlogd log program
-#                    which logs boot messages.
+### BEGIN INIT INFO 
+# Provides:          shutdown-bootlogd 
+# Required-Start:
+# Required-Stop:     umountroot halt reboot 
+# Default-Start:      
+# Default-Stop:      0 6 
+# X-Stop-After:      umountfs 
+# Short-Description: Stop bootlogd at shutdown. 
+# Description: 
 ### END INIT INFO

 PATH=/sbin:/bin  # No remote fs at start
diff -ur ./shutdown-start-bootlogd /etc/init.d/shutdown-start-bootlogd
--- ./shutdown-start-bootlogd\t2014-02-20 13:59:23.430107513 +0000
+++ /etc/init.d/shutdown-start-bootlogd\t2014-02-20 11:10:56.238656828 +0000
@@ -1,24 +1,24 @@
 #! /bin/sh
 ### BEGIN INIT INFO
-# Provides:          stop-bootlogd
-# Required-Start:    $local_fs $all
-# Required-Stop:
-# Default-Start:     2 3 4 5
-# Default-Stop:
-# Short-Description: Stop bootlogd
-# Description:       See the init.d/bootlogd script
+# Provides:          shutdown-start-bootlogd
+# Required-Start:
+# Required-Stop:     $local_fs $all
+# Default-Start:
+# Default-Stop:      0 6
+# Short-Description: Start or stop bootlogd at shutdown.
+# Description:
 ### END INIT INFO

-NAME=stop-bootlogd
+NAME=shutdown-start-bootlogd
 DAEMON=/sbin/bootlogd

 [ -x "$DAEMON" ] || exit 0

 case "$1" in
-  start)
-\t/etc/init.d/bootlogd stop
+  stop)
+\t/etc/init.d/bootlogd start
 \t;;
-  stop|restart|force-reload)
+  start|restart|force-reload)
 \t# No-op
 \t;;
   status)
' | patch

update-rc.d shutdown-bootlogd defaults
update-rc.d shutdown-start-bootlogd defaults

bootlogdが停止する前に表示されるすべてのメッセージは、/var/log/bootに格納されます。 bootlogdは、テキストストリームからエスケープ文字を削除します。次の(bash)コマンドは、シャットダウン中に表示されるように、ログを色で表示します。

sed $'s/\^\[/\E/g;s/\[1G\[/\[27G\[/' /var/log/boot | less -r

これの詳細については、この質問を参照してください- https://stackoverflow.com/questions/10757823/display-file-with-escaped-color-codes-boot-messages-from-bootlog-daemon/1901114 =

ログの場所は、スクリプトをさらに編集することで変更できます。残念ながら、ファイルの外観はすべて変更する必要があります(また、スクリプトがcdから/ver/log/bootを一度に実行するため、/var/logを置き換えるだけでは不十分です)。

上記は、/var/logがrootfsにある場合にのみ機能します。そうでない場合は、umountfsが停止した後にbootlogdが実行されるように依存関係を修正する必要があります。または、rootfs上のファイルにログを記録します。

3
Graeme

/var/log/messagesは、必要なデータを提供します。それで十分でない場合は、modify/etc/syslog.confすべてのデータをログに記録します(カーネルエラーログを有効にするように見えますが、* kernとも呼ばれます)がREVERT IT BACK再起動後ログのためにたくさんのスペースを食べる

0
kaboom

Graemeが言ったように、roまたはマウント解除されたファイルシステムでは、klogdを強制終了しました。そのような情報をファイルに書き込む方法はありません。解決策は、bootargsで定義されたコンソール(シリアルポート)を使用することです。ヌルモデムケーブルと別のPC(タブレットまたはスマートフォンと適切なアダプター)およびターミナルエミュレーターを接続するだけです。

0
fich