如何在Windows 10的VirtualBox Ubuntu 20.04.5虚拟机中终止无法杀死的进程?
如何在Windows 10的VirtualBox Ubuntu 20.04.5虚拟机中终止无法杀死的进程?
看起来你遇到的是**不可中断睡眠状态(D状态)**的进程,这种进程是出了名的难杀——因为它正卡在内核态等待硬件IO响应,完全不理会用户态的任何信号,包括kill -9这种终极杀招。从你提供的ps -Al输出能看到,isp_cli进程的状态是4 D,这就是问题的核心。结合你的场景(USB转CAN通信程序),我给你几个可行的解决思路:
1. 优先尝试断开关联的USB设备
既然你的程序是和USB转CAN硬件通信,大概率是设备卡死导致进程挂在了IO等待上。你可以直接在VirtualBox的菜单栏操作:
- 打开虚拟机的「设备」菜单
- 找到对应的USB转CAN设备,点击取消挂载(也就是把设备从虚拟机中移除)
当虚拟机失去对该USB设备的控制权后,内核会发现IO无法完成,通常会强制终止卡住的进程,或者让它从D状态退出回到用户态,这时候再用常规杀进程命令就有效了。
2. 使用SysRq工具强制干预(需开启SysRq)
Linux的SysRq是一种内核级的应急工具,可以绕过用户态直接给内核发指令,对付D状态进程有奇效:
- 先确认SysRq是否开启:执行
cat /proc/sys/kernel/sysrq,如果输出是1或者大于0的数字,说明可以使用。 - 先打印进程栈信息排查问题:
echo t > /proc/sysrq-trigger,这条命令会把所有进程的栈信息输出到dmesg里,你可以用dmesg | tail查看,确认isp_cli到底卡在哪一步。 - 尝试逐步终止进程:
- 先发送SIGTERM信号:
echo e > /proc/sysrq-trigger(会给除init以外的所有进程发SIGTERM,谨慎使用) - 如果不行,发送SIGKILL:
echo i > /proc/sysrq-trigger(强制杀死除init以外的所有进程,注意这会影响其他正在运行的程序)
- 先发送SIGTERM信号:
3. 检查VirtualBox的USB控制器配置
有时候USB控制器的兼容性问题也会导致进程挂死:
- 关闭虚拟机,打开VirtualBox的虚拟机设置
- 找到「USB」选项卡,尝试切换USB控制器版本(比如从USB 3.0改成USB 2.0,或者反之)
- 重启虚拟机后再测试你的程序,看是否还会出现挂死情况
4. 卸载关联的USB驱动模块(风险较高)
如果以上方法都不行,你可以尝试卸载进程依赖的USB驱动模块,强制中断IO等待:
- 先通过
dmesg查看你的USB转CAN设备对应的驱动模块(通常是usbserial或者厂商特定模块) - 执行
sudo rmmod <模块名>卸载模块,这会强制终止所有依赖该模块的进程 - 之后可以用
sudo modprobe <模块名>重新加载模块恢复USB功能
补充说明
D状态进程的本质是:进程正在内核态等待硬件IO操作完成,如果硬件没有响应(比如设备意外断开、设备固件卡死),内核就会一直等下去,此时任何用户态的信号都无法唤醒它。只有让IO操作被强制中断(比如移除设备、卸载驱动),进程才会被内核终止。
备注:内容来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

