Есть глючный проприетарный драйвер для USB TV Tuner-а avermedia модель а828.
После запуска от простого пользователя tvtime иногда не работает - появляется окно и нет синала.
После закрытия окна tvtime становится "зомби". Вот что выдает ps -ef:
.........
sasa 8637 8636 0 21:20 ? 00:00:00 gnome-pty-helper
sasa 8638 8636 0 21:20 pts/0 00:00:00 bash
sasa 8646 8636 0 21:20 pts/1 00:00:00 bash
sasa 8647 8646 1 21:20 pts/1 00:00:01 tvtime
sasa 8648 8647 0 21:20 pts/1 00:00:00 [tvtime] <defunct>
sasa 8649 2 0 21:20 ? 00:00:00 [MAKO_CGMSA]
sasa 8651 8647 0 21:21 pts/1 00:00:00 [tvtime] <defunct>
sasa 8656 8638 0 21:22 pts/0 00:00:00 ps -ef
после попытки закрытия родительского процесса kill -9 8646:
......
sasa 8638 8636 0 21:20 pts/0 00:00:00 bash
sasa 8647 1 0 21:20 ? 00:00:01 tvtime
sasa 8648 8647 0 21:20 ? 00:00:00 [tvtime] <defunct>
sasa 8649 2 0 21:20 ? 00:00:00 [MAKO_CGMSA]
sasa 8651 8647 0 21:21 ? 00:00:00 [tvtime] <defunct>
родительским процессом становится init. Как избавиться от этого "зомби" ?
Он мешает потому что повторный запуск tvtime выдает:
Reading configuration from /home/sasa/.tvtime/tvtime.xml
Cannot run two instances of tvtime with the same configuration.
А кто изначально родитель сего процесса? Какая-нибудь открытая прога? Тогда можно костыль в ней поставить чтобы при каком-нибудь действии вызывалась функция wait() (убивает всех потомков данного родителя, в том числе и зомби)
kill поумолчанию не завершает процесс принудительно, а лишь "вежливо" просит его умерерь, я вам за пять минут наваяю скрипт на перле который на kill pid будет выводить "Otsosi my zalupa", надо послать сигнал принудительного завершения -9, не помю сейчас его названия.
sh - это обычно симлинк на bash. Да и не причем тут шелл. Дело в драйвере кривом. Из-под рута такая ситуация как правило не возникает, хотя тоже бывало. Я пробовал подключиться gdb к родительскому процессу - который ожидает ввода-вывода но он не отвечает.
> Дело в драйвере кривом. Из-под рута такая ситуация как правило не возникает, хотя тоже бывало. Я пробовал подключиться gdb к родительскому процессу - который ожидает ввода-вывода но он не отвечает.
Ну ты сам ответил на все сови вопросы. Родитель этого зомби находится в состоянии 'D' -- uninterruptible sleep. Это значит, что он ожидает возврата из ядерной функции, чаще всего, это происходит из-за ожидания окончания ввода/вывода в ядре. Но драйвер, видимо, завис. Убить такой процесс невозможно в принципе (никакие kill -9 не работают), ибо он на данный момент исполняется с привилегиями ядра, а ядро свои процессы не сдает :)
Единственный способ -- перезагрузка, а радикальный -- поиск бага в драйвере или глючного железа в компе.
> 'D' -- uninterruptible sleep. Это значит, что он ожидает возврата из ядерной функции, чаще всего, это происходит из-за ожидания окончания ввода/вывода в ядре. Но драйвер, видимо, завис. Убить такой процесс невозможно в принципе
В общем получилось как в пословице - не было бы счастья да несчастье
помогло. После обновления ядра до версии 2.6.25 драйвер от tv tuner
перестал собираться из-за использования в проприетарном драйвере части
кода GPL. Я сделал по аналогии с проприетарными драйверами от nvidia -
немного подправил Makefile.
Добавил после этой строчки:
EXTRA_CFLAGS += -I$(KERNELSRC)/drivers/media/dvb/dvb-core -DUSE_SWIC2
Небольшой кусок:
EXTRA_LDFLAGS := --defsym usb_alloc_urb=0x$(shell grep "T usb_alloc_urb" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_kill_urb=0x$(shell grep "T usb_kill_urb" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_get_urb=0x$(shell grep "T usb_get_urb" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_unlink_urb=0x$(shell grep "T usb_unlink_urb" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_deregister=0x$(shell egrep -m 1 "T usb_deregister" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_set_interface=0x$(shell grep "T usb_set_interface" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_control_msg=0x$(shell grep "T usb_control_msg" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_submit_urb=0x$(shell grep "T usb_submit_urb" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_get_dev=0x$(shell egrep -m 1 "T usb_get_dev" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_bulk_msg=0x$(shell grep "T usb_bulk_msg" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_put_dev=0x$(shell grep "T usb_put_dev" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_clear_halt=0x$(shell grep "T usb_clear_halt" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_register_driver=0x$(shell grep "T usb_register_driver" /boot/System.map | colrm 9)
EXTRA_LDFLAGS += --defsym usb_free_urb=0x$(shell grep "T usb_free_urb" /boot/System.map | colrm 9)
После сборки и утановки все заработало - tvtime больше не зависает.
TV Tuner avermedia usb model no A828, версия ядра 2.6.25, версия
драйвера 0.17 beta. После выхода новой версии ядра avermedia почему-то
убрали со своего сайта драйвер для linux. Осталось одно большое но :) Звук не работает - и не только у меня.
> Толку-то с микроядерной архитектуры, если у тебя драйвер жесткого отвалился. Все рано нормальная работа невозможна.
Как раз, если можно прибить кривой драйвер - только тогда она и возможна. Неужели вы считаете висящие трупы драйверов и рыскающие по системе зомби признаками нормальной работы системы?
> Неужели вы считаете висящие трупы драйверов и рыскающие по системе зомби признаками нормальной работы системы?
естественно.
вот если бы система начала спонтанно перезагружаться, впадать в панику или (О УЖАС!) показывать БСОД — тогда бы я засомневался бы в стабильности системы.