答案:通过systemd服务单元或SysVinit脚本在关机前执行自定义日志脚本,记录系统状态并写入日志文件或系统日志。具体做法包括创建收集进程、网络、磁盘等信息的脚本,设置systemd服务确保其在关机早期运行,并通过logger发送关键信息至系统日志,同时应对超时、权限、磁盘只读等问题,实现故障诊断、安全审计和性能分析。

在Linux系统中设置关机前的日志记录,核心思路是利用系统关机流程中的钩子(hooks),在系统真正关闭服务和文件系统之前,执行一个自定义脚本来捕获关键系统状态信息,并将其写入日志系统。这通常通过systemd服务单元或传统的SysVinit运行级别脚本来实现,确保这些日志能够被rsyslog或systemd-journald妥善记录。
要实现关机前的日志记录,我们通常会创建一个自定义脚本,然后确保这个脚本在系统关机序列的早期阶段被执行。这里主要有两种现代Linux系统中的方法:
方法一:使用Systemd服务单元
这是目前主流Linux发行版(如CentOS 7/8, Ubuntu 16.04+等)推荐的方式。我们可以创建一个systemd服务单元,让它在
shutdown.target
reboot.target
halt.target
创建日志记录脚本: 首先,我们需要一个脚本来收集你关心的信息。例如,我们可以收集当前运行的进程、网络连接、磁盘使用情况以及内核消息。
创建一个文件,比如
/usr/local/bin/pre_shutdown_log.sh
#!/bin/bash # 记录关机前的系统状态 LOG_FILE="/var/log/pre_shutdown_status.log" TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") echo "--- System Shutdown Log Start: $TIMESTAMP ---" >> "$LOG_FILE" echo "Running processes:" >> "$LOG_FILE" ps aux --sort -rss >> "$LOG_FILE" 2>&1 echo "" >> "$LOG_FILE" echo "Network connections:" >> "$LOG_FILE" ss -tulnp >> "$LOG_FILE" 2>&1 echo "" >> "$LOG_FILE" echo "Disk usage:" >> "$LOG_FILE" df -h >> "$LOG_FILE" 2>&1 echo "" >> "$LOG_FILE" echo "Last login/shutdown events:" >> "$LOG_FILE" last -x >> "$LOG_FILE" 2>&1 echo "" >> "$LOG_FILE" # 将关键信息也通过logger发送到系统日志,便于集中管理 logger -t "PRE_SHUTDOWN" "System is preparing to shut down. Detailed status logged to $LOG_FILE" logger -t "PRE_SHUTDOWN" "Top processes by RSS: $(ps aux --sort -rss | head -n 2 | tail -n 1)" echo "--- System Shutdown Log End: $TIMESTAMP ---" >> "$LOG_FILE"
给脚本添加执行权限:
sudo chmod +x /usr/local/bin/pre_shutdown_log.sh
创建Systemd服务单元文件: 在
/etc/systemd/system/
pre-shutdown-logger.service
[Unit] Description=Pre-shutdown System Status Logger DefaultDependencies=no Conflicts=shutdown.target reboot.target halt.target Before=shutdown.target reboot.target halt.target RequiresMountsFor=/var/log [Service] Type=oneshot ExecStart=/usr/local/bin/pre_shutdown_log.sh TimeoutStartSec=60 # 给脚本足够的时间执行,避免被过早终止 StandardOutput=journal StandardError=journal [Install] WantedBy=shutdown.target reboot.target halt.target
这里有几个关键点:
DefaultDependencies=no
Conflicts=...
Before=...
RequiresMountsFor=/var/log
/var/log
Type=oneshot
ExecStart
TimeoutStartSec
StandardOutput=journal
journalctl
启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable pre-shutdown-logger.service
enable
方法二:传统的SysVinit运行级别脚本(适用于旧系统或特定场景)
对于仍然使用SysVinit或需要兼容老旧系统的场景,可以在
/etc/rc0.d/
/etc/rc6.d/
创建脚本: 同上一步骤的
/usr/local/bin/pre_shutdown_log.sh
创建软链接: 创建一个以
K
K01
sudo ln -s /usr/local/bin/pre_shutdown_log.sh /etc/rc0.d/K01pre_shutdown_log sudo ln -s /usr/local/bin/pre_shutdown_log.sh /etc/rc6.d/K01pre_shutdown_log
这里的
K01
在我看来,关机前的日志记录就像是系统在“临终”前留下的遗言。我们都遇到过服务器突然重启后,某些服务启动失败,或者系统在关机过程中卡住的情况。如果没有关机前的日志,我们就像是面对一个失忆的病人,无从得知它在失去意识前经历了什么。
具体来说,它提供了几个关键价值:
选择记录什么以及如何记录,这需要一些思考,毕竟我们不希望日志过多而拖慢关机,也不希望日志太少而失去价值。我的经验是,要抓住那些最能反映系统“健康状况”和“活跃状态”的关键指标。
合适的日志内容:
ps aux --sort -rss
ps auxf
ps auxf
ss -tulnp
netstat -tulnp
df -h
du -sh /path
dmesg
uptime
top -b -n 1
last -x
lsof
lsof
systemctl status mariadb
nginx -t
记录方式:
>> /var/log/pre_shutdown_status.log
logger
logger -t "PRE_SHUTDOWN" "Your message here"
syslog
syslog
systemd-cat
journald
journald
StandardOutput=journal
journald
systemd-cat -t "pre-shutdown-script" echo "My custom message"
我个人倾向于结合使用:将详细的、可能包含大量输出的信息写入一个独立的、有时间戳的日志文件,而将关键的、摘要性的信息通过
logger
journalctl
tail -f /var/log/messages
在实际环境中部署关机前的日志记录,并非一帆风顺,总会遇到一些小麻烦。这就像你给系统装了个“黑匣子”,但有时这个黑匣子本身也会遇到问题。
挑战一:脚本执行超时或被过早终止
lsof
TimeoutStartSec
Before=
DefaultDependencies=no
挑战二:磁盘I/O问题或文件系统已只读
RequiresMountsFor=/var/log
/var/log
logger
syslog
df -h /var/log
/dev/shm
logger
挑战三:权限问题
/proc
/var/log
chmod +x
/var/log
挑战四:日志量过大,占用过多资源或难以分析
ps aux
pstree
logrotate
logger
挑战五:脚本本身的调试困难
set -x
ExecStart=/bin/bash -x /usr/local/bin/pre_shutdown_log.sh > /tmp/pre_shutdown_debug.log 2>&1
这些挑战都需要我们在部署时多一份细心和预判,但只要策略得当,关机前的日志记录就能成为我们系统管理中一个非常强大的工具。
以上就是如何在Linux中设置关机前的日志记录?shutdown命令与日志系统的整合技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号