Answers:
似乎没有办法将此数据记录到文件中。对于引导过程,有bootlogd
用于创建文件的软件包/var/log/boot
,而对于关机/重新引导过程则没有任何包。据我所知,两者均无法登录rsyslog
,即使存在,也有rsyslog
停止后打印的消息。我的关机/重新引导过程的一部分是将rootfs只读地重新装载,然后重新装载其他所有东西,在将日志记录到下次启动时仍然存在的文件之后,这几乎是不可能的。
我看到的查看消息的最简单方法是将/etc/init.d/halt
and和/或/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等)。您可以阅读屏幕上打印的消息。如果屏幕上显示的文本不止一个,则可以按来查看终端回滚Shift+PgUp
。如果这还不够,可以使用多种方法来增加回滚缓冲区的大小(虽然可能是一个不同的问题)。
要在系统重新引导时执行相同的操作,必须编辑/etc/init.d/reboot
文件。当然reboot
,此处使用的命令halt
与之相反,并且应该再次位于do_stop
函数末尾。对我来说,行是:
reboot -d -f -i
再次在上面的新行中插入以下内容:
read -p "Press enter to reboot" reply
还要注意,这些文件被列为该initscripts
程序包的配置文件。升级软件包时,默认情况下不会破坏这些编辑,尽管它们会引起冲突。
一个更完整的解决方案是使用以下脚本:
#! /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
。dpkg
这样,在升级过程中也不会有conffile冲突。
实时查看日志
我发现在关闭过程中通常会有一个Ubuntu徽标和指示灯闪烁,而不是显示关闭过程的日志。如果有错误,则将它们显示出来,但是会比较混乱。但是,在关闭时,如果我按Windows键和r
(Metar),那么我会看到系统服务的成功与失败,因为它们发生了。这样我就知道到底是什么东西坏了。不知道此键盘快捷键是特定于我的Kubuntu设置还是什么?我没有添加。.我偶然发现的其中一个,以某种方式...
重新启动后查看日志
重新引导系统后,错误消息应保存到日志文件中。哪个日志文件取决于哪个服务被破坏/配置错误。相关日志几乎肯定会在/var/log/
(或其子目录中)。ls
,less
,grep
并find
一直我需要在日志中查找错误消息的唯一项目...
找到错误和引起错误的服务后,您无需重新启动即可测试新配置;只需重新启动服务即可。希望您可以使用以下命令测试固定配置:
sudo service <service name> restart
在研究了如何bootlogd
实际执行日志记录之后,事实证明可以说服它记录关闭/重新引导过程以及启动过程。bootlogd
在启动过程的早期启动。然后,它使用tty
和pts
设备进行一些操作,将所有输出记录到与其连接的终端。然后在引导过程中稍后停止它,大概是在它开始记录来自的用户的输出之前tty
。
如果bootlogd
在关闭/重新引导过程中再次启动并在卸载包含日志的文件系统之前停止,则将记录大多数关闭过程的记录,以供下次启动时读取。
bootlogd
通过使用两个init
脚本,可以在启动过程中同时启动和停止。一个是普通的init
脚本,它可以正常启动/停止该过程。另一个是“反向” init
脚本,其中当使用调用时start
,它将使用stop调用第一个脚本。这“欺骗”了该sysvinit
过程,看起来它实际上在启动和停止同一服务时正在启动两个单独的服务。这是确保一切按正确顺序发生的必要条件。
要bootlogd
在关机期间运行,需要执行以下操作:
bootlogd
如果尚未安装,请安装。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
有关此详细信息,请参阅此问题-/programming/10757823/display-file-with-escaped-color-codes-boot-messages-from-bootlog-daemon/19011140
可以通过进一步编辑脚本来更改日志的位置。不幸的是,文件的每一次出场必须改变(也更换/ver/log/boot
是不够的脚本将cd
要/var/log
在一个点)。
上面的内容也仅/var/log
在rootfs上有效。如果不是,则需要重新处理依赖项,以便umountfs
在bootlogd
停止后完成。否则登录到rootfs上的文件。
您需要编辑所有/etc/rc6.d/*文件,并将它们的输出重定向到某个文件,稍后可以阅读。
此重定向还会告诉您哪个程序 failed
和why
。
此外,您必须start-stop-daemon
通过删除来修改--quiet
参数并-v
在所有这些文件中添加参数。
如果这样做,请确保将所有所做的更改回滚。在进行更改之前备份现有文件将是一个好主意。
/etc/init.d
(/etc/rc?.d
到此处的所有链接)中编辑片段不会执行任何操作。输出不是直接的,而是通过它中的函数/lib/lsb/init-functions
以及其他文件(这些文件又是它们的来源)提供的。您可以编辑这些,但是某些升级会掩盖更改。
start-stop-daemon
来自OP PoV。现在等待他的答复
start-stop-daemon
产生任何输出,至少不会正常产生。脚本基于使用的返回输出生成ok / fail输出log_end_msg
。请参阅/lib/lsb/init-functions.d/20-left-info-blocks
。
/var/log/messages
将为您提供所需的数据。如果您还不够,请修改/etc/syslog.conf
为记录所有数据(我希望启用内核错误日志记录,也称为* kern),但在重新启动后再回退,否则它将占用大量日志空间
/etc/syslog.conf
。只有sysctl.conf sysctl.d/ systemd/
。