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

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

В настоящее время я делаю $ 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 который содержит программу, которая будет делать именно это.

  • Подстановки команд vs обратные сбрасывания экранов в цитируемой строке
  • Как анализировать переменную env в цитируемой строке?
  • Заменить рабочий каталог на 2 терминала одновременно
  • Почему мы дважды цитируем оценку знака доллара в Bash?
  • Как найти только поиск файлов в измененных каталогах?
  • Каков наилучший способ определить рабочий каталог для процесса UNIX с помощью «ps»?
  • Как сделать дубликаты с разными именами из одного файла?
  • Как совместить * со скрытыми файлами внутри каталога
  • Создание массивов с расширением брекета в цикле
  • Как получить две команды?
  • Сценарий оболочки выполняется по-разному на основе рабочего каталога.
  • Interesting Posts

    Как использовать команду «оставить» в Xubuntu?

    Использование оператора bash «&» с разделителем «;»?

    Cent OS 6.6 разрешает аутентификацию Plaintext для dovecot и postfix

    В чем разница между ~ / .profile, ~ / .bashrc, ~ / .bash_profile, ~ / .gnomerc, / etc / bash_bashrc, / etc / screenrc …?

    Отключить повторную сборку IP-фрагмента в пересылаемых датаграммах

    Правило Udev, устанавливающее сокет SocketCAN, работает корректно только при запуске вручную

    следует ли исправить «Нет поддержки ALTQ в ядре» для запуска брандмауэра?

    Добавление строки в начале файла со значениями, вычисленными с даты

    Как диагностировать висит на выключении

    bind не разрешает FQDN из файла корневых ссылок

    Разрешения для Linux меняются автоматически

    Как сопоставить «4.4» с `uname -r`?

    Получите дефолт ubuntu motd в раковине рыбы

    Как указать домашний каталог Linux и оболочку на сервере Active Directory Samba?

    Стандартная папка установки соглашения для GitEye на Linux и как ее запустить

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