Linux завершить дочерние процессы

Linux завершить дочерние процессы

Запускаем скрипт, скрипт пускает чтонить, например игрушку.
Как убить порожденные процессы? Все дерево процессов.

В принципе «один слой» можно убить так:
pkill -P пид_скрипта
Но что если есть «второй слой», третий? Как замочить их всех?

И есть ли какой нибудь системный вызов для этого? Что то типа
bool killthemall(int pid);
=))))

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

  • как убить все дочерние процессы, angra, 22:22 , 10-Дек-07, ( 1 )
    • как убить все дочерние процессы, AITech, 23:02 , 10-Дек-07, ( 2 )
      • как убить все дочерние процессы, angra, 04:56 , 11-Дек-07, ( 3 )
        • как убить все дочерние процессы, AITech, 22:20 , 11-Дек-07, ( 4 )
          • как убить все дочерние процессы, angra, 05:52 , 12-Дек-07, ( 6 )
  • как убить все дочерние процессы, ipmanyak, 22:46 , 11-Дек-07, ( 5 )
  • как убить все дочерние процессы, Keeper, 09:56 , 12-Дек-07, ( 7 )

Сообщения по теме [Сортировка по времени | RSS]

>И есть ли какой нибудь системный вызов для этого? Что то типа

А зачем? У вас какие-то странные желания. Если все процессы вменяемые, то посылка TERM(но не KILL) родителському должна привести к схлопыванию всего дерева. Если же по каким-либо причинам корректного завершения по TERM не происходит, то после убийства корневого через KILL все остальные останутся зомбями и init их сам придушит, а если не придушит, то просто грепаем по Zz вывод ps и отдаем KILL всем зомбям. Альтернативно можно конечно написать простенький скрипт, который будет проходить по дереву процессов начиная от какого-то PID и посылать KILL всем потомкам.

1 . «как убить все дочерние процессы»
Сообщение от angra (ok) on 10-Дек-07, 22:22
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2 . «как убить все дочерние процессы»
Сообщение от AITech on 10-Дек-07, 23:02

>>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>А зачем? У вас какие-то странные желания. Если все процессы вменяемые, то
>посылка TERM(но не KILL) родителському должна привести к схлопыванию всего дерева.
>Если же по каким-либо причинам корректного завершения по TERM не происходит,
>то после убийства корневого через KILL все остальные останутся зомбями и
>init их сам придушит, а если не придушит, то просто грепаем
>по Zz вывод ps и отдаем KILL всем зомбям. Альтернативно можно
>конечно написать простенький скрипт, который будет проходить по дереву процессов начиная
>от какого-то PID и посылать KILL всем потомкам.

Должна но не приводит =)
Например в скрипте прописываем запуск популярной игрушки
/usr/games/wormux
запускаем, видим в процессах
PID — PPID — NAME
555 — xxx — bash
556 — 555 — wormux

убиваем kill -s TERM 555, wormux не реагирует, можно играть дальше.

З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить одну запущенную игру, при запуске другой.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3 . «как убить все дочерние процессы»
Сообщение от angra (ok) on 11-Дек-07, 04:56

Я же сказал при условии вменяемости процессов 🙂

>З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить
>одну запущенную игру, при запуске другой.

напишите простой bash или perl скрипт, который убивает всю ветку. Для поиска всех pid может оказаться полезной pstree. Например
$pstree -p 3654
firefox-bin(3654)-+-(3665)
|-(3666)
|-(3684)
|-(3685)
|-(3747)
|-(3756)
`-(3769)
$ pstree -p 3654| perl -ne ‘print «$1\n» foreach /\((\d+)\)/g;’
3665
3665
3666
3684
3685
3747
3756
3769
Заменяем print на `kill -9 $1` и все умрет 🙂

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4 . «как убить все дочерние процессы»
Сообщение от AITech on 11-Дек-07, 22:20

>[оверквотинг удален]
>$ pstree -p 3654| perl -ne ‘print «$1\n» foreach /\((\d+)\)/g;’
>3665
>3665
>3666
>3684
>3685
>3747
>3756
>3769
>Заменяем print на `kill -9 $1` и все умрет 🙂

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6 . «как убить все дочерние процессы»
Сообщение от angra (ok) on 12-Дек-07, 05:52

звиняюсь сделал глупейшую ошибку. Надо
perl -ne ‘print «$1\n» while /\((\d+)\)/g;’
или
perl -ne ‘print «$_\n» foreach /\((\d+)\)/g;’
то есть либо $1+while либо $_+foreach, но не $1+foreach иначе будет ерунда когда несколько процессов в одной строке вывода pstree.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5 . «как убить все дочерние процессы»
Сообщение от ipmanyak (??) on 11-Дек-07, 22:46

>[оверквотинг удален]
>Как убить порожденные процессы? Все дерево процессов.
>
>В принципе «один слой» можно убить так:
>pkill -P пид_скрипта
>Но что если есть «второй слой», третий? Как замочить их всех?
>
>И есть ли какой нибудь системный вызов для этого? Что то типа
>
>bool killthemall(int pid);
>=))))

killall имя_родителя_процесса
не подойдет ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7 . «как убить все дочерние процессы»
Сообщение от Keeper (??) on 12-Дек-07, 09:56

Программку htop ещё можно попробовать.

Источник

Kill: Завершение неконтролируемых процессов

Вы усердно боретесь с особо заковыристым приложением Линукс. Продираясь через дебри документации, запускаете команды и правите конфигурационные файлы. Все работает, и жизнь прекрасна. Как вдруг вас ошарашивает сообщение «send the process a SIGHUP» (пошлите процессу SIGHUP).

По инерции вы движетесь дальше. Что это за SIGHUP такой, и как его посылают? Вы почти уверены, что это не команда, но, на всякий случай, пробуете. Нет, не то. Перечитываем ман к приложению:

Когда получен сигнал о том, что программа зависла — SIGHUP, sshd перечитывает свой конфигурационный файл путем запуска самой себя с теми же именем и опциями, с которыми была первоначально запущена, например, /usr/sbin/sshd.

Программисты против пользователей

Сигналы и контроль над процессами

Сигналы нужны для того, чтобы взаимодействовать с процессами и демонами. Процессом называется любое активное действие. Демоны являются фоновыми (background) процессами, и до поры скрыты. Они ждут либо события, на которое они отреагируют, либо наступления времени, назначенного для выполнения некоего задания по расписанию. О наступлении этого события они узнают, получая сигнал от какого-то другого процесса. Каждая программа должна иметь в своем коде обработчик сигналов, чтобы отслеживать (перехватывать) сигналы и правильно реагировать на них. Страница руководства man signal описывает всевозможные сигналы и их действия. Сигналы посылают при помощи команды kill («убить»). Команда kill -l выводит список сигналов и их номеров.

Все демоны и процессы имеют Идентификатор Процесса (PID). PID процесса можно узнать при помощи команды ps:

В приведенном выше примере, вывод команды сильно сокращен — в вашей системе вы увидите куда больше строк и столбцов. Если какой-нибудь процесс «ворует» мощность вашего процессора или вашу память, вы увидите это в столбцах %CPU и %MEM.

Еще быстрее «зарвавшийся» процесс можно обнаружить при помощи команды top. В ней, по умолчанию, процессы, потребляющие больше ресурсов процессора, расположены в верхних строках таблицы. Мы можем немного поиграть с программой top при помощи команды yes:

$ yes carla is teh awesum

Эта команда станет повторять «carla is teh awesum» с большой скоростью, пока вы ее не остановите. Она загонит процент использования процессора в красную зону:

Интересно, что ответственность за разбазаривание мощности CPU ложится на консоль, а не на программу yes, так как yes работает внутри консоли. Если вы перейдете на «истинную» консоль (Ctrl+Alt+F2), то там увидите программу yes с большими цифрами потребления мощности процессора и использования памяти.

Существует несколько способов остановить yes. Если вы перейдете обратно в шелл, где она работает, просто нажмите Ctrl+C. Вы можете также остановить ее при помощи команды kill в другом шелле, как по PID, так и по имени:

$ kill 22236
$ killall yes

Ctrl+C посылает с клавиатуры сигнал SIGINT (2), или завершающее прерывание (terminate interrupt). kill и killall, оба, шлют по умолчанию SIGTERM (15). SIGTERM (15) может быть перехвачен и, либо игнорирован, либо интерпретирован иначе. Так что, в случае непредсказуемой работы, вы можете не добиться завершения процесса.

Применяя команду kill к родительскому процессу, вы, как правило (но не всегда), завершаете дочерний вместе с ним. Как узнать, какой процесс является дочерним? Используйте команду ps с опцией -f :

Вернемся к нашим SIGHUP’ам

# killall -HUP ‘process-name’

Как видите, можно использовать PID или имя процесса, а также имя или номер сигнала.

Зачем применять все эти команды, когда можно перезапустить процессы при помощи команды /etc/init.d/foo restart? Ведь предпочтительней контролировать сервисы с помощью их файлов init, так как такой контроль обычно включает санацию, проверку ошибок и другие функции. Если говорить честно, то главная причина использовать команду kill и сигналы состоит в том, чтобы остановить зависший или сбойный процесс как можно аккуратнее, и не прибегать к перезагрузке или завершению сеанса.

Применение команды kill к процессам

kill -STOP ‘pid’
SIGSTOP (19) останавливает процесс, не «убивая» его.

kill -CONT ‘pid’
SIGCONT (18) перезапускает остановленный процесс.

kill -KILL ‘pid’
SIGKILL (9) форсирует немедленное завершение процесса, и не производит никакой чистки.

kill -9 -1
Завершает все ваши процессы (которыми вы владеете).

SIGKILL и SIGSTOP не могут быть перехвачены, блокированы или игнорированы; остальные могут. Это ваше «большое ружье», последнее средство обороны.

Команда kill, встроенная в Bash

$ type -all kill
kill is a shell built-in
kill is /bin/kill

Маловероятно, что у вас возникнут конфликты или странное поведение программ, но на всякий случай выбирайте /bin/kill.

Не поленитесь получше познакомиться с большим миром команды kill, изучив приведенные ниже ресурсы. Это предоставит вам возможность решать возникающие проблемы путем тонкого хирургического вмешательства, не прибегая к перезагрузке системы при каждом сбое программы.

Ресурсы

  • Глава 7 «Starting and Stopping Linux», Поваренная книга Линукс (the Linux Cookbook)

bash (1) — GNU Bourne-Again Shell

yes (1) — повторно выводит строку, пока не будет остановлена

signal (7) — список сигналов

ps (1) — мгновенный снимок идущих процессов

kill (1) — посылает сигнал процессу

killall (1) — «убивает» процесс по имени

pkill (1) — ищет или дает сигнал процессам на основе имени или других атрибутов

skill (1) — посылвет сигнал, либо рапортует о статусе процесса

  • xkill (1) — «убивает» клиента по его Х ресурсу
  • Источник

    Завершение дочерних процессов

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

    А если не секрет, подскажите как. Буду очень благодарен.

    сейчас структура программы такая:

    Программа TEST . if (условие) pid=fork(); if (pif==0) exec(вызов программы); else вот тут надо убить дочерние процессы

    Проверял по PID, структура примерно такая: PID PPID Имя проццеса 2 1 TEST 3 2 процесс вызванный в EXEC (omxplayer) 10 3 процесс созданный omxplayer

    Нужно «убить» PID 10. PID 2 и 3 в программе получить могу. PID последнего потомка нет. Беда

    как ты «убиваешь» процесс omxplayer? если дочерний его процесс в той же группе (pgroup), он тоже получит сигнал. сделай ps -eo sess,pgrp,ppid,pid,comm чтобы увидеть группу процессов. если его дочерний процесс сознательно помещен в отдельную группу, то «чистого» способа добиться желаймого нет — есть разной степени хаки. можно загнать их в cgroup/session и убить все в cgroup/session; можно подменить через ldpreload fork для omxplayer, с тем чтобы записывать его результат; можно в конце-концов искать всех «детей» твоего дочернего omxplayer через /proc.

    а что ты вообще пытаешься сделать?

    Закидывай в список все пиды дочерних процессов, потом отсылай им сигналы. И еще…

    Задача стоит следующая: 1. есть RaspberryPI 2. с помощью omxplayer при загрузке системы запустить аудиодорожку №1 (это сделано) 3. сделать обработку состояния входов RBPI — при подаче на один вход сигнала высокого уровня: 3.1. запускается omxplayer, который начинает проигрывать аудиодорожку №2 (первая работает). при подаче сигнала низкого уровня 3.2. аудиодорожка №2 останавливается

    Аудиодорожка №1 должна остаться нетронутой.

    Задача — сделать это на С.

    Я предположил, что это моно решить: 1. запустить аудиодорожку №1 прописав команду на е запуск в автозагрузку 2. написать на С программку с применение wiringPi библиотеки для обработка состояния входов 3. В цикле опрашивать состояние входа и при изменении уровня сигнала сначала запустить воспроизведение аудио с помощью комбинации fork(), exec() 4. Убить запущенный дочерний процесс с помощью kill(PID,-9)

    По факту получается: 1. обрабатываю состояние входа 2. запускаю аудиод. При этом вызов fork()+execelp(«omxplayer»,) привод к тому, что в основном процессе (TEST) создается дочерний процесс omxplayer, а к этому процессу создается еще один дочерний, который проигрывает аудио (или что-то делает с этим аудиофайлом). Убить omxplayer удается без проблем. Но при этом его потомок, который собственно и отвечает за работу аудио продолжает работать.

    Источник

    Читайте также:  Acer aspire z5771 драйвера windows 10
    Оцените статью