问题现象描述
最近在管理Linux服务器时遇到一个奇怪的问题:当通过SSH连接执行shutdown -r now
命令时,系统会在显示"Sending processes the KILL signal"消息后卡住,必须手动按电源键强制重启。但如果在本地终端执行相同命令,却能正常关机重启。
初步诊断方法
首先我们需要确认是哪个进程导致了关机挂起。可以通过以下方法收集信息:
# 查看系统日志
journalctl -b -1 | grep -i "shutdown"
# 或者更具体的搜索
journalctl -b -1 | grep -i "kill"
# 另一种方法是查看进程树
pstree -a -p
常见原因分析
根据经验,这类问题通常与以下情况有关:
- SSH会话保持的进程未正确处理终止信号
- 某些服务(如NFS、数据库)未正常关闭
- 系统资源监控工具阻止关机
- 文件系统卸载失败
深入排查步骤
我们可以使用systemd的调试模式来获取更详细的信息:
# 启用调试日志
systemctl --no-pager -l status systemd-shutdown
# 查看关机时的进程状态
ps -eo pid,ppid,cmd --forest
解决方案尝试
以下是几种可能的解决方案,建议按顺序尝试:
# 方案1:强制终止所有用户进程
pkill -u username
# 方案2:修改SSH配置
echo "ClientAliveInterval 60" >> /etc/ssh/sshd_config
echo "ClientAliveCountMax 3" >> /etc/ssh/sshd_config
systemctl restart sshd
# 方案3:使用更激进的关机命令
shutdown -r now --no-wall
永久解决方案
如果确认是SSH相关的问题,可以创建自定义关机服务:
# /etc/systemd/system/pre-shutdown.service
[Unit]
Description=Pre-shutdown tasks
DefaultDependencies=no
Before=shutdown.target reboot.target
[Service]
Type=oneshot
ExecStart=/usr/bin/pkill -u sshuser
TimeoutStartSec=0
[Install]
WantedBy=shutdown.target
然后启用该服务:
systemctl enable pre-shutdown.service
验证与测试
修改后,可以通过以下命令测试:
systemctl start pre-shutdown.service
shutdown -r now
同时建议监控系统日志,确认问题是否解决:
tail -f /var/log/syslog | grep -E "shutdown|kill"