Как приостановить и возобновить процессы, такие как bash

этот вопрос является продолжением: как приостановить и возобновить процессы

Я начал firefox из сеанса bash в gnome-terminal.

  • В zsh, как я могу быстрее отказаться от процесса переднего плана?
  • Получает ли этот диспетчер процесс зомби?
  • Ubuntu apt -f установить эквивалент в Fedora
  • Является ли «управление терминалом» исключительно для пользовательского контроля?
  • sigint не распространяется на фоновый дочерний процесс
  • Что означает команда pkill -USR1 -n -x dd?
  • Дерево процессов выглядит так:

    $ ps -e -o pid,ppid,cmd -H 1828 1 gnome-terminal 26677 1828 bash 27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox 27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin 27989 27985 /usr/lib/firefox-3.6.15/firefox-bin 28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true 

    Когда я нажимаю CTRL+Z в bash, он приостанавливает firefox. Когда я выдаю команду bg (или fg ), она возобновит firefox. Это так, как ожидалось.

    Когда я kill -s SIGTSTP 27980 команду kill -s SIGTSTP 27980 в другой терминал, она будет печатать строку [1]+ Stopped firefox в первом терминале (точно так же, как когда я нажимаю CTRL+Z ), но она не приостанавливает firefox. Я предполагаю, что он только приостанавливает скрипт оболочки.

    Когда я kill -s SIGTSTP 27989 команду kill -s SIGTSTP 27989 (обратите внимание на PID) в другом терминале, она приостанавливает firefox. Первый терминал не принимает к сведению это.

    Как bash приостанавливает все дерево процессов? он просто пересекает дерево и SIGTSTP всех детей?

  • Сценарий Bash не видит SIGHUP?
  • Почему «kill -l» не отображает номера сигналов 32 и 33?
  • Попытка увидеть обработчики по умолчанию для различных сигналов
  • Что такое ожидающие сигналы?
  • Ошибка фиксации сигнала 13 (SIGPIPE) для поиска и grep-конвейера
  • Как проверить, остановлен ли процесс из командной строки?
  • One Solution collect form web for “Как приостановить и возобновить процессы, такие как bash”

    Работы Shell работают в «группах процессов»; посмотрите на столбец PGRP в расширенном выпуске ps . Они используются как для управления заданиями, так и для определения того, кто «владеет» терминалом (real или pty).

    POSIX (взятый из System V) использует отрицательный идентификатор процесса, чтобы указать группу процессов, так как группа процессов идентифицируется первым процессом в группе («лидер группы процессов»). Поэтому вы должны использовать ps для определения группы процессов, а затем kill -s TSTP "-$pgrp" . (Попробуйте ps -u"$USER" -opid,ppid,pgrp,cmd .)

    В дереве процессов группа процессов начинается с сценария firefox запущенного bash , поэтому группа процессов будет 27980, и команда будет kill -s TSTP -27980 .

    Естественно, чтобы возобновить процессную группу, выпустите kill -s CONT -- -27980 .

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