Як призупинити та відновити процеси, як це робить bash


13

це питання є наслідком: Як призупинити та відновити процеси

Я запустив firefox з bash сесії в gnome-терміналі.

Дерево процесу виглядає так:

$ 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в баш, він призупинить firefox. Коли я видаю команду bg(або fg), вона відновиться firefox. Це як очікувалося.

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

Коли я видаю команду kill -s SIGTSTP 27989(зверніть увагу на PID) в іншому терміналі, вона призупинить firefox. Перший термінал цього не враховує.

Як bash призупиняє все технологічне дерево? це просто перетинає дерево і SIGTSTP всіх дітей?



Ви повинні додати pgidдо своєї psкоманди, щоб побачити групи процесів @geekosaur.
ніндзя

Відповіді:


17

Робочі місця Shell живуть у «процесних групах»; подивіться на PGRPстовпчик у розширеному psобсязі. Вони використовуються як для контролю за роботою, так і для визначення того, хто "є власником" терміналу (реального або пті).

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.


7
До речі, bashце не робиться SIGTSTPпід час введення ^Z; оскільки firefoxгрупа процесів - це поточна група процесу терміналу, драйвер терміналу (педантично, лінійна дисципліна) посилає SIGTSTPвсі процеси в цій групі процесів. bashякраз waitpid()на ньому (та будь-які інші завдання). Інші термінальні сигнали, такі як ^Cі ^\ працюють аналогічно. (мета: SE ненавидить, що ctrl-
backslash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.