LINUX.ORG.RU
ФорумAdmin

Как почистить зомби


0

0

Есть глючный проприетарный драйвер для 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.


Ответ на: комментарий от borisych

>эээ... kill 8647

Это было сделано в первую очередь - я об этом даже и не стал писать.. Процесс уже не существует поэтому убивать его бесполезно. Он "зомби".

koTuk
() автор топика
Ответ на: комментарий от borisych

bash-3.2$ ps ax
.............
 8647 ?        D      0:01 tvtime
 8648 ?        Z      0:00 [tvtime] <defunct>
 8649 ?        D      0:00 [MAKO_CGMSA]
 8651 ?        Z      0:00 [tvtime] <defunct>
 8770 pts/0    R+     0:00 ps ax

koTuk
() автор топика

В общем в solaris есть такая команда - preap. Существует ли что-то подобное в linux ?

koTuk
() автор топика

for i in $(ps -ef | grep <чего-то-там> | awk {print $1}); do; kill $i; done

Или что-то в этом духе.

marsijanin ★★
()

А кто изначально родитель сего процесса? Какая-нибудь открытая прога? Тогда можно костыль в ней поставить чтобы при каком-нибудь действии вызывалась функция wait() (убивает всех потомков данного родителя, в том числе и зомби)

temy4
()
Ответ на: комментарий от temy4

Родитель - хоть кто, кто умеет что то запускать :) В данном случае был bash, у bash в свою очередь был родитель xfce-совый Terminal.

koTuk
() автор топика
Ответ на: комментарий от gnomino

kill поумолчанию не завершает процесс принудительно, а лишь "вежливо" просит его умерерь, я вам за пять минут наваяю скрипт на перле который на kill pid будет выводить "Otsosi my zalupa", надо послать сигнал принудительного завершения -9, не помю сейчас его названия.

gnomino
()
Ответ на: комментарий от koTuk

kill -9 -pid -- именно такой синтаксис, ну если не прокатит то только ребут, это самый "сильный" системный сигнал смерти.

gnomino
()
Ответ на: комментарий от koTuk

ну я конечно понимаю, что это то еще костыле-строение, но таки попробуй пропатчить баш =)

или попробуй кстати запустить под каим-нибудь zsh, sh, csh...

temy4
()
Ответ на: комментарий от temy4

sh - это обычно симлинк на bash. Да и не причем тут шелл. Дело в драйвере кривом. Из-под рута такая ситуация как правило не возникает, хотя тоже бывало. Я пробовал подключиться gdb к родительскому процессу - который ожидает ввода-вывода но он не отвечает.

koTuk
() автор топика
Ответ на: комментарий от koTuk

> Дело в драйвере кривом. Из-под рута такая ситуация как правило не возникает, хотя тоже бывало. Я пробовал подключиться gdb к родительскому процессу - который ожидает ввода-вывода но он не отвечает.

Ну ты сам ответил на все сови вопросы. Родитель этого зомби находится в состоянии 'D' -- uninterruptible sleep. Это значит, что он ожидает возврата из ядерной функции, чаще всего, это происходит из-за ожидания окончания ввода/вывода в ядре. Но драйвер, видимо, завис. Убить такой процесс невозможно в принципе (никакие kill -9 не работают), ибо он на данный момент исполняется с привилегиями ядра, а ядро свои процессы не сдает :)

Единственный способ -- перезагрузка, а радикальный -- поиск бага в драйвере или глючного железа в компе.

annoynimous ★★★★★
()
Ответ на: комментарий от koTuk

>Дело в драйвере кривом.

>8647 ? D 0:01 tvtime

Если процесс висит на сисколе, который не может закончиться из-за кривого драйвера, его не убить, только reboot спасет.

mky ★★★★★
()
Ответ на: комментарий от annoynimous

> 'D' -- uninterruptible sleep. Это значит, что он ожидает возврата из ядерной функции, чаще всего, это происходит из-за ожидания окончания ввода/вывода в ядре. Но драйвер, видимо, завис. Убить такой процесс невозможно в принципе

Да.. Архитектурка-то явно не микроядерная.

anonymous
()
Ответ на: комментарий от anonymous

> Да.. Архитектурка-то явно не микроядерная.

Толку-то с микроядерной архитектуры, если у тебя драйвер жесткого отвалился. Все рано нормальная работа невозможна.

annoynimous ★★★★★
()

В общем получилось как в пословице - не было бы счастья да несчастье
 помогло. После обновления ядра до версии 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. Осталось одно большое но :) Звук не работает - и не только у меня. 

koTuk
() автор топика

В общем задаче сводится к тому, как убрать процесс из планировщика задач. VIM в зубы и патчи ядро.

cvs-255 ★★★★★
()
Ответ на: комментарий от annoynimous

> Толку-то с микроядерной архитектуры, если у тебя драйвер жесткого отвалился. Все рано нормальная работа невозможна.

Как раз, если можно прибить кривой драйвер - только тогда она и возможна. Неужели вы считаете висящие трупы драйверов и рыскающие по системе зомби признаками нормальной работы системы?

anonymous
()
Ответ на: комментарий от anonymous

> Неужели вы считаете висящие трупы драйверов и рыскающие по системе зомби признаками нормальной работы системы?

естественно.

вот если бы система начала спонтанно перезагружаться, впадать в панику или (О УЖАС!) показывать БСОД — тогда бы я засомневался бы в стабильности системы.

trapezoid
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.