Как создать дерево процессов?

У меня есть код, который убивает процессы и их детей / внуков. Я хочу проверить этот код.

В настоящее время я делаю $ watch date > date.txt , который создает процесс с дочерним $ watch date > date.txt .

Есть ли способ создать родительский -> ребенок -> дерево внуков ? Какая команда может это сделать?

4 Solutions collect form web for “Как создать дерево процессов?”

 #!/bin/sh #This is a process with an id of $$ ( sleep 1000 )& #this creates an idle child ( (sleep 1000)& sleep 1000 )& #this creates an idle child and grandchild wait #this waits for direct children to finish 

Запуск выше как ./1.sh & в моей системе создал следующее дерево процессов:

 $ command ps -o pid,ppid,pgrp,stat,args,wchan --forest PID PPID PGRP STAT COMMAND WCHAN 24949 4783 24949 Ss /bin/bash wait 25153 24949 25153 S \_ /bin/sh ./1.sh sigsuspend 25155 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep 25156 25153 25153 S | \_ sleep 1000 hrtimer_nanosleep 25158 25156 25153 S | \_ sleep 1000 hrtimer_nanosleep 

Вы можете заметить, что дерево имеет одну и ту же группу процессов ( PGRP ) 25153, которая идентична PID первого процесса. Оболочка создает группу процессов всякий раз, когда вы запускаете новую команду в интерактивном режиме (или при включенном управлении заданиями).

Механизм PGRP позволяет оболочке сразу отправлять сигнал всей группе процессов, не создавая условия гонки. Это используется для управления заданиями, а когда ваш скрипт работает и переднего плана, для отправки:

  • (SIG) INTR, когда пользователь нажимает CC
  • (SIG) QUIT, когда пользователь нажимает C- \
  • (SIG) STP, когда пользователь нажимает CZ

Вы можете сделать то же самое, например:

 kill -INTR -25153 

где INTR – это сигнал, а 25153 – группа процессов, к которой вы хотите отправить сигнал. - до 25153 означает, что вы нацеливаете идентификатор PGRP, а не PID .

В вашем случае сигнал, который вы должны отправлять, это -TERM (завершение запроса). Термин является отправкой сообщений об отключении сигнала по умолчанию, однако вы должны указать его явно, если вы настроите таргетинг на группу, а не на PID .

 kill -TERM -25153 

Если вы хотите убить группу процессов из последнего фонового задания, которое вы начали, вы можете выполнить:

 kill -TERM -$! 

Добавить вызов оболочки

 sh -c "watch date > date.txt" 

Для большего количества уровней добавьте больше оболочек вокруг

Вы можете создать рекурсивный скрипт. например, в файле /tmp/run

 #!/bin/bash depth=${1:-3} f(){ let depth-- if [ $depth -gt 0 ] then $0 $depth else sleep 999 fi } f 

затем chmod +x /tmp/run и do /tmp/run 3 .

Команда ps на freebsd, похоже, не может создать дерево процессов. К счастью, есть пакет под названием pstree который содержит программу, которая будет делать именно это.

  • Как получить время выполнения SCP в миллисекундах?
  • Есть ли ярлык для повторного запуска команды с аргументами из последней команды (не cd, ls или echo)
  • Вложенные строки в команде bash
  • диапазон конкретных котов от / etc / hosts до диалогового окна
  • Команда «повторно применить» предыдущую команду?
  • Bash для соответствия каталогам, имена которых начинаются с точки (периода), будучи «явным», вместо использования «shopt -s dotglob»?
  • Создание массивов с расширением брекета в цикле
  • удалить каталог со специальным символом в имени файла
  • Разделить одну строку в массив символов, используя ТОЛЬКО bash
  • Использование регулярного выражения для извлечения содержимого файла
  • Как записывать все входные и выходные данные терминала в локальный файл по умолчанию для каждого сеанса?
  • Interesting Posts

    KMail: поиск сообщений с приложением

    Могу ли я запретить использование пространства подкачки для определенного процесса (и его просто убить)?

    может ping google dns, но не google.de -> неизвестный хост // работал в другой сети

    colordiff – как сохранить цвет при сохранении файла

    Завершение установки Debian

    «Globbing» (*) происходит от «глобальной команды» … А?

    Проблемы с драйвером для Wi-Fi-карты Broadcom в Debian

    Запуск perf на пользовательском ядре, которое не поставляется с / tools или gcc

    Функция «Встряхнуть, чтобы найти курсор»

    Почему «init 6» – команда перезагрузки? (исторические причины)

    Команда установки Linux

    Centos внутри Virtualbox – как установить пользовательское разрешение?

    Сценарий Bash не может расширять переменную среды, несмотря на несколько разных подходов

    socat отключить двойное эхо

    localhost cron issue, log показывает, что cmd запущен, но сценарий фактически не запускался. Что я делаю неправильно?

    Linux и Unix - лучшая ОС в мире.