Процесс Linux переходит в состояние D, когда я подключаю последовательное устройство через USB-концентратор - PullRequest
0 голосов
/ 12 марта 2011

У меня есть последовательный GPS, подключенный к встроенному ПК через последовательный <-> USB-адаптер (Prolific PL2303). Каждые 5 минут сценарий оболочки запускает сценарий Python, который считывает данные GPS через Pyserial, а затем загружает их в Интернет. Если я подключаю свой GPS непосредственно к ПК (через PL2303), все в порядке, и моя система работает вечно, НО, если я использую USB-HUB между pl2303 и ПК, у меня возникает эта проблема: скрипт Python работает нормально в течение 3-6 часов затем он переходит в D-состояние (непрерывный сон), и сценарий оболочки не может запустить его снова (я могу только выключить систему, уничтожение невозможно). Я проверил свой скрипт и использовал USB-концентраторы разных производителей (с питанием и без) с тем же результатом.

PS На моем встроенном компьютере (от Embeddedarm) установлен обновленный Debian Lenny.

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Процесс в состоянии D означает, что ядро ​​(скорее всего, драйвер устройства) поместило ваш процесс в непрерывный сон.

Честно говоря, вы, как пользователь, вряд ли сможете с этим поделать, если только вы не собираетесь отлаживать стек USB ядра и / или конкретный драйвер устройства с набором микросхем USB.

Вот что будет делать -

  1. Убедитесь, что в конфигурации ядра встроенного устройства включена опция конфигурации ядра для магического ключа sysreq и включена конфигурация времени выполнения для него. См. http://en.wikipedia.org/wiki/Magic_SysRq_key о том, как это сделать.

  2. Воссоздайте проблему (переведите процесс в состояние D).

  3. Найдите PID застрявшего скрипта Python с помощью ps и запустите для него strace -p PID. Это даст вам конкретный системный вызов, в котором находится спящий процесс.

  4. Отправьте команду волшебного ключа sysreq 't', в которой перечислены все задачи и их стек ядра на консоль. Ищите конкретную задачу скрипта python по PID, посмотрите, в какой именно части кода ядра вы застряли.

  5. Откройте код ядра и попытайтесь отладить проблему, если можете, или перенесите ее в соответствующий список рассылки, если вы этого не сделаете.

Еще одним предложением будет попытаться выяснить, устраняется ли проблема в более новой версии ядра, чем поставляется Debian. Если это так, вы знаете, что это ошибка, исправленная в более новой версии ядра, и у вас есть выбор: использовать более новую версию и попытаться перенести исправление на старую версию, которую вы используете.

Удачи! тебе это понадобится ...

0 голосов
/ 12 марта 2011

Панель запуска Ubuntu содержит сообщение об ошибке, которое подозрительно похоже на ваше.Предложенный обходной путь:

modprobe -r pl2303
modprobe pl2303

Проверьте, работает ли это вокруг ошибки?

...