如何调试systemd关机时无法优雅终止QEMU进程的问题?
如何调试systemd关机时无法优雅终止QEMU进程的问题?
我遇到了一个头疼的问题:我的主机上跑着开发者临时启动的QEMU虚拟机,正常情况下用pkill -F <qemu pid文件>给它发SIGTERM,它能在几毫秒内优雅退出,还会在日志里留下关机记录。但每次系统重启或关机后,QEMU的pid文件都会残留,说明它是被SIGKILL强制杀掉的,而且systemd完全没在日志里说明为啥要发SIGKILL。
我已经做的排查步骤
- 查上一次系统的关机日志:执行
journalctl -b -1,日志里只看到systemd-shutdown发送了SIGTERM给剩余进程,但QEMU的日志里只有启动信息,连SIGTERM的影子都没,说明它根本没收到这个信号 - 检查systemd-shutdown的配置:
systemctl show systemd-shutdown显示TimeoutStopUSec是1分30秒,但实际关机时根本没等这么久,直接就发了SIGKILL - 手动测试终止速度:哪怕是QEMU刚启动的最糟情况,
pkill -F <pidfile>也只需要0.036秒就能完成,完全不存在超时的可能 - 偶尔抓到的异常日志:当开发者在Konsole里直接启动QEMU(没开守护/后台模式)时,能看到systemd日志里报错:
Failed to kill control group ... Operation not permitted,然后直接给QEMU发了SIGKILL
后来我把systemd升级到254.4版本,终于看到了更明确的日志,但问题更迷惑了:systemd在关机启动的同一秒就给QEMU发了SIGKILL,完全没等配置里的1分30秒超时。
接下来可以尝试的调试和解决方向
- 检查cgroup的权限与Delegate配置:我的系统用的是cgroup2,而且
systemctl show -p Delegate session-1.scope显示Delegate=no,这可能导致systemd没法正常处理控制组内的进程,直接跳过优雅终止步骤发SIGKILL。可以尝试给用户会话的scope开启Delegate,或者调整QEMU所在cgroup的权限设置 - 调高systemd日志级别捕获细节:用
systemd-analyze log-level debug临时把日志级别调到debug,下次关机时就能捕获到systemd处理进程的详细流程,搞清楚它为啥跳过SIGTERM直接杀进程,或者为啥不等待超时 - 用systemd临时管理QEMU进程:虽然开发者是临时启动QEMU,但可以用
systemd-run命令来启动它,或者写个简单的临时.service文件,让systemd规范管理它的生命周期,这样关机时会按照正常的终止流程来处理,避免被Konsole的app scope直接强制杀掉 - 跟踪QEMU的信号接收情况:用
strace -p <qemu-pid> -e signal跟踪QEMU进程的信号接收,确认它是不是真的能正确处理SIGTERM,有没有其他进程干扰或者QEMU在某些状态下忽略了这个信号 - 检查scope的终止配置:查看QEMU所在的Konsole app scope的KillMode和KillSignal配置,比如用
systemctl show app-org.kde.konsole-xxx.scope,有时候scope的终止策略和service不同,可能导致直接发SIGKILL
备注:内容来源于stack exchange,提问作者gcb
相关产品推荐
相关产品推荐

