SSH远程重启服务器卡在”发送KILL信号”问题排查与解决


阅读 7 次

问题现象描述

最近在管理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"