我有一个串行 GPS 通过串行 <->USB 适配器 (Prolific PL2303) 连接到嵌入式 PC。每 5 分钟一个 shell 脚本运行一个 Python 脚本,该脚本通过 Pyserial 读取 GPS 数据,然后将它们上传到互联网。如果我将我的 GPS 直接插入 PC(通过 PL2303),一切正常,我的系统永远运行但是如果我在 pl2303 和 PC 之间使用 usb HUB,我会遇到这个问题:Python 脚本运行正常大约 3-6 小时然后它进入 D 状态(不间断 sleep )并且 shell 脚本无法再次运行它(我只能关闭系统,不可能杀死)。我检查了我的脚本,并使用了来自不同供应商(有源和无源)的 USB 集线器,结果相同。
PS 我的嵌入式电脑(来自 Embeddedarm)运行更新的 Debian Lenny。
我能修好吗?
最佳答案
处于 D 状态的进程意味着内核(很可能是设备驱动程序)已将您的进程置于不间断 sleep 状态。
老实说,作为用户,您可能无能为力,除非您打算调试内核 USB 堆栈和/或特定的 USB 芯片组设备驱动程序。
这是会做的 -
确保您的嵌入式设备的内核配置具有用于魔法 sysreq key 的内核配置选项,并且它的运行时配置已打开。请参阅:http://en.wikipedia.org/wiki/Magic_SysRq_key关于如何做到这一点。
重现问题(让进程卡在 D 状态)。
用 ps 找出卡住的 python 脚本的 PID,并在其上运行 strace -p PID。这将为您提供进程正在休眠的特定系统调用。
发送神奇的 sysreq 键命令“t”,列出所有任务及其内核堆栈到控制台。通过PID查找python脚本的具体任务,看看你到底卡在了内核代码的哪一部分。
如果可以,请打开内核代码并尝试调试问题,如果不能,请将其移植到相关邮件列表。
另一个建议是尝试看看问题是否在比 Debian 发布的更新的内核版本中消失。如果是这样,您就知道这是在较新版本的内核中修复的错误,您可以选择使用较新版本并尝试将修复程序移植到您关心使用的旧版本。
祝你好运!你会需要它...
关于当我通过 USB 集线器连接串行设备时,Linux 进程进入 D 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5281579/