Linux завершить дочерние процессы
Запускаем скрипт, скрипт пускает чтонить, например игрушку.
Как убить порожденные процессы? Все дерево процессов.
В принципе «один слой» можно убить так:
pkill -P пид_скрипта
Но что если есть «второй слой», третий? Как замочить их всех?
И есть ли какой нибудь системный вызов для этого? Что то типа
bool killthemall(int pid);
=))))
Оглавление |
|
Сообщения по теме | [Сортировка по времени | RSS] |
1 . «как убить все дочерние процессы» | |
Сообщение от angra | |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
2 . «как убить все дочерние процессы» | |
Сообщение от AITech | |
Должна но не приводит =) убиваем kill -s TERM 555, wormux не реагирует, можно играть дальше. З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить одну запущенную игру, при запуске другой. | |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
3 . «как убить все дочерние процессы» | |
Сообщение от angra | |
Я же сказал при условии вменяемости процессов 🙂 >З.Ы. желания нисколько не странные. Пишу клиента для компьютерного зала. Нужно убить напишите простой bash или perl скрипт, который убивает всю ветку. Для поиска всех pid может оказаться полезной pstree. Например | |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
4 . «как убить все дочерние процессы» | |
Сообщение от AITech | |
| |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
6 . «как убить все дочерние процессы» | |
Сообщение от angra | |
| |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
5 . «как убить все дочерние процессы» | |
Сообщение от ipmanyak | |
killall имя_родителя_процесса | |
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору |
7 . «как убить все дочерние процессы» | |
Сообщение от Keeper | |
Источник 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 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’ kill -CONT ‘pid’ kill -KILL ‘pid’ kill -9 -1 SIGKILL и SIGSTOP не могут быть перехвачены, блокированы или игнорированы; остальные могут. Это ваше «большое ружье», последнее средство обороны. Команда kill, встроенная в Bash$ type -all kill Маловероятно, что у вас возникнут конфликты или странное поведение программ, но на всякий случай выбирайте /bin/kill. Не поленитесь получше познакомиться с большим миром команды kill, изучив приведенные ниже ресурсы. Это предоставит вам возможность решать возникающие проблемы путем тонкого хирургического вмешательства, не прибегая к перезагрузке системы при каждом сбое программы. Ресурсы
bash (1) — GNU Bourne-Again Shell yes (1) — повторно выводит строку, пока не будет остановлена signal (7) — список сигналов ps (1) — мгновенный снимок идущих процессов kill (1) — посылает сигнал процессу killall (1) — «убивает» процесс по имени pkill (1) — ищет или дает сигнал процессам на основе имени или других атрибутов skill (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 удается без проблем. Но при этом его потомок, который собственно и отвечает за работу аудио продолжает работать. Источник |