You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 08:34:28