Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> kill -KILL pid - процесс не прибивается... dosbox завис. 
V
    Опции темы
JackYF
Дата 23.8.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



Я в небольшом шоке.
Итак:

вырезка из топа:
Цитата

423 jackyf    17   0 44264 3720 2792 D  0.0  0.5   0:01.01 dosbox


Цитата

kill -KILL 423
jackyf@yfnote-debian:~$ echo $?
0

предыдущую процедуру повторял раз 10.

sudo kill эффекта тоже не дает.

Процессу хоть бы хны. Завис и закрываться не хочет.

Дочерних процессов нет, вроде бы:
pstree:
Цитата

init─┬─atd
     ├─avahi-daemon───avahi-daemon
     ├─cron
     ├─2*[dbus-daemon]
     ├─dbus-launch
     ├─dcopserver
     ├─dirmngr
     ├─dosbox
     ├─events/0


Есть идеи, как это прибить без перезагрузки?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bilbobagginz
Дата 24.8.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



это бывает возможно, когда программа:
1. игнорирует signal 9
2. спит ( suspended )
3. waiting for I/O

в некоторых случаях смерть наступает очень много времени после посыла сигнала.
в некоторых программа потихоньку переходит в состояние ZOMBIE.

короче - RTFM




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
JackYF
Дата 24.8.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



Цитата(bilbobagginz @  24.8.2007,  00:52 Найти цитируемый пост)
игнорирует signal 9

по ману вообще-то программа его игнорировать не может...

В зомби или defunct программа не перешла за полчаса.

В общем, кроме перезагрузки, ничего не помогло.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bilbobagginz
Дата 24.8.2007, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 113
Всего: 317



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


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
JackYF
Дата 24.8.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



Цитата(bilbobagginz @  24.8.2007,  09:23 Найти цитируемый пост)
что непонятно ? 

как прибить можно было тот процесс без перезагрузки. Нельзя так нельзя.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 24.8.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



JackYF
такое может быть, когда процесс находится в состоянии 
TASK_UNINTERRUPTIBLE
например ожидание на операции I/O (у меня такое было, когда я пытался читать с неисправного CD-ROM)
Код

...
set_current_state(TASK_UNINTERRUPTIBLE);
while (!wait_some_event()) /* событие не происходит */
    schedule(); /* переключаем контекст */
...

kill просто устанавливает бит в маске сигналов нужного процесса и ничего более (поэтому возвращаемое значение = 0 (echo $?))
на пришедший сигнал должен реагировать сам процесс (которому этот сигнал пришел), вызвав do_signal()
проверка этим процессом флага TIF_SIGPENDING в thread_info происходит в некоторых заранее определенных точках кода (например при возвращении из системного вызова)
но так как у нас процесс "застрял" в цикле ожидания события (см. выше), то поток выполнения не попадает ни в одну из этих точек и do_signal() не может быть вызван, тем самым нет реакции на посылку сигнала
имхо, выхода тут нет никакого
разве что писать модуль ядра и попытаться вручную завершить процесс (но тут есть опасность того, что в wait_some_event() были захвачены блокировки или другие средства синхронизации)
что для этого надо
1. Пишем модуль-убийцу  smile (в качестве интерфейса взаимодействия USER <-> KERNEL используем, например, /proc)
2. В модуле реализуем процедуру "убивания", которая:
    а) Находит нужный процесс (по pid-у)
    б) Находит адрес области памяти по которому сохраняется контекст процесса при его переключении
Код

struct task_struct * task;
/* находим процесс */
...
task -> thread.eip = (unsigned long)&__kill_procedure;
...
static void __kill_procedure(void) {
    do_exit(1);
}

    в) В этой области по известному смещению лежит EIP возврата (когда процесс снова получит управление, то перейдет по этому EIP)
    г) Подменяем EIP на адрес процедуры из нашего модуля (тем самым процесс выйдет из цикла и попадет в нашу процедуру)
    в) В процедуре инициализировать завершение процесса (вызвать do_exit() с кодом ошибки)


Это сообщение отредактировал(а) MAKCim - 24.8.2007, 11:22


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 26.8.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



MAKCim, развернуто, спасибо.

Одного я всё-таки не понял. У нас же в качестве главного выступает ядро, а все процессы - это только процессы.
Почему ядро (его часть, отвечающая за процессы и их контексты) штатно не может само убить процесс? Ведь по идее оно знает, какие средства синхронизации были захвачены, какие файлы открыты, где и сколько памяти было выделено... Дальше освобождаем синхро-средства, закрываем принудительно все файлы, освобождаем всю память, стираем инфу о том, что есть такой процесс... переключения контекста больше не происходит, процесса больше нет, все довольны.

Я что-то забыл/упустил?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 27.8.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



Цитата(JackYF @  26.8.2007,  20:48 Найти цитируемый пост)
Почему ядро (его часть, отвечающая за процессы и их контексты) штатно не может само убить процесс?

а причина по которой оно должно это сделать?
нету причины...по крайней мере с точки зрения ядра
процесс ресурсы CPU практически не использует, только проверяет возникновение события и сам отдает управление другому процессу
да, есть необработанные сигналы, но процесс должен их сам обработать
почему?
вот банальный пример
мы ставим обработчик на сигнал SIGINT
обработчик находится в адресном пространстве процесса (< 0xC0000000)
процесс перешел в режим ядра и там "завис"
мы посылаем ему kill, kill - обычный системный вызов, выполняющийся в контексте специально созданного для этого процесса
семантика обработки сигнала предусматривает проверку, был ли установлен процессом его обработчик
но т. к kill работает в другом процессе и доступ к обработчику он не имеет (адресные пространства пользователя различны), поэтому он просто устанавливает флаг в битовой маске сигналов нужного процесса, что дескать пришел сигнал и нужно его обработать, когда сможешь
все-таки по умолчанию Linux - это не Real-Time система, поэтому 100%-ой реакции на событие ожидать не приходится
Цитата(JackYF @  26.8.2007,  20:48 Найти цитируемый пост)
Ведь по идее оно знает, какие средства синхронизации были захвачены, какие файлы открыты, где и сколько памяти было выделено...

про средства синхронизации оно ничего не знает
в thread_info процесса есть поле preempt_count (счетчик захваченных блокировок)
оно увеличивается на 1 при захвате любой блокировки (спин-блокировки, семафора и т. д)...и все
т. е ядро не в курсе адресов самих блокировок и их типов, поэтому ничего сделать не может



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 27.8.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



хм, кое-что прояснилось...

Цитата(MAKCim @  27.8.2007,  08:43 Найти цитируемый пост)
ядро не в курсе адресов самих блокировок и их типов, поэтому ничего сделать не может

э? а кто же тогда отвечает за реализацию всех этих самых средств сихнронизации?

мда, надо бы найти книженцию, где устройство это хорошо расписано, а то вон куча вопросов...



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 27.8.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



Цитата(JackYF @  27.8.2007,  11:03 Найти цитируемый пост)
э? а кто же тогда отвечает за реализацию всех этих самых средств сихнронизации?

реализация в ядре
но как ей пользоваться решает программист
теоретически, естественно, можно предусмотреть в функциях захвата блокировок сохранение их адресов и типов, но:
блокировка может быть захвачена в обработчике прерывания => ее захват должен быть быстр
как обеспечить быстроту (с учетом требования выше)?
создать статический массив структур, где будут храниться адреса и типы блокировок
НО тогда мы сталкнемся с ограничением на количество блокировок, которые могут быть захвачены
какое решение? использовать динамический список вместо массива
НО тогда при каждом захвате блокировки придется выделять память для очередной структуры, сохраняющей ее адрес и тип, а это медленно
какое решение? создать кэш структур
НО кэш тоже не бездонный (хотя его размер может быть намного больше, чем размер статического массива)
вообщем дилемма между скоростью и гибкостью  smile 
самый простой способ - вообще отказаться от такого механизма  smile

Добавлено через 4 минуты и 8 секунд
по поводу книжек
нет ничего лучше исходников  smile...ну или этой книги


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
powerfox
Дата 27.8.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(MAKCim @  27.8.2007,  12:34 Найти цитируемый пост)
нет ничего лучше исходников  smile...ну или этой книги 

Или Таненбаума smile Та книга всё-таки предполагает, что читатель знаком с устройством ОС.


--------------------
user posted image
PM WWW   Вверх
MAKCim
Дата 27.8.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



powerfox
имхо, она написана очень неплохо и главное не слишком сложно
поэтому, думаю, пойдет  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 27.8.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 14
Всего: 162



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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.