Что такое «лидеры сессий» в «ps»?

79

Что такое лидеры сеансов, в ps -dкоторых выбираются все процессы, кроме лидеров сеансов?

это я
источник

Ответы:

84

В Linux каждый процесс имеет несколько идентификаторов, связанных с ним, в том числе:

  • Идентификатор процесса (PID)

    Это произвольное число, идентифицирующее процесс. Каждый процесс имеет уникальный идентификатор, но после завершения процесса и получения родительским процессом статуса выхода идентификатор процесса освобождается для повторного использования новым процессом.

  • ID родительского процесса (PPID)

    Это просто PID процесса, который запустил данный процесс.

  • ID группы процессов (PGID)

    Это просто PID лидера группы процессов. Если PID == PGID, то этот процесс является лидером группы процессов.

  • Идентификатор сеанса (SID)

    Это просто PID лидера сеанса. Если PID == SID, то этот процесс является лидером сеанса.

Сессии и группы процессов - это просто способы рассматривать ряд связанных процессов как единое целое. Все члены группы процессов всегда принадлежат одному и тому же сеансу, но сеанс может иметь несколько групп процессов.

Обычно оболочка будет лидером сеанса, а каждый конвейер, выполняемый этой оболочкой, будет группой процессов. Это сделано для того, чтобы легко убить потомков оболочки при выходе из нее. (См. Выход (3) для подробностей.)

Я не думаю, что есть специальный термин для члена сеанса или группы процессов, который не является лидером.

CJM
источник
5
Примечание. Используйте ps xao pid,ppid,pgid,sid,commдля просмотра этих идентификаторов.
Майк Р
1
Почему люди не дают больше таких иллюстративных ответов на основе сравнения реального мира .. +1
RootPhoenix
24

Лидер сеанса - это процесс, в котором идентификатор сеанса == идентификатор процесса. Это звучит надуманно, но идентификатор сеанса наследуется дочерними процессами. Некоторые операции в UNIX / Linux работают с сеансами процессов, например, сводят на нет идентификатор процесса при отправке системного вызова или команды kill. Наиболее распространенное использование для этого при выходе из оболочки. ОС отправит сообщение kill -HUP -$$, которое отправит сигнал SIGHUP (зависание) всем процессам с тем же идентификатором сеанса, что и оболочка. Когда вы отказываетесь от процесса, идентификатор сеанса этого процесса изменяется из оболочки, поэтому он не будет реагировать на сигнал зависания. Это одна часть процесса, чтобы стать процессом демона.

Большинство процессов, вызываемых из оконного менеджера / графической среды, имеют тот же идентификатор сеанса, что и одна из программ запуска. Это позволяет ОС выполнять одну и ту же kill -HUP -$$операцию над всеми программами: браузером, музыкальным проигрывателем, libreoffice, IM-клиентом и т. Д. Это процессы, которые не являются лидерами сеансов.

Arcege
источник
Пожалуйста, не возражайте, но мне, возможно, понадобится немного больше разъяснений - лидер сессии один, как называются другие, и как они выглядят (поведение, чем они отличаются от лидера сессии)?
its_me
Их называют участником сессии, я считаю.
Arcege
Мне нравится ваше объяснение, но мне все еще не хватает одного момента: IIUC, каждый раз, когда я запускаю процесс, он на самом деле является потомком оболочки, в которую я вошел (конечно, если я не отказался от нее). Почему ОС не может просто пройтись по дереву процессов и убить всех братьев и сестер этого процесса и их братьев и сестер? (На самом деле это то, о чем я всегда думал ... до сегодняшнего дня: D) Так в чем же причина использования сессий?
Алоис Махдал
Необходимо определить, когда процесс больше не является частью исходного сеанса (например, оболочка входа в систему или демон). Одной из мыслей может быть автоматическое изменение PPID (родительского pid) на 1, но это нарушает дерево процессов. Новый идентификатор сеанса создает группу, которой можно было бы отправить сигнал вместе. Примером этого является GUI, запуск Firefox в качестве отдельного сеанса. Затем, когда кнопка [X] нажата, отправьте сигнал сеансу firefox и его дочерним элементам, но оконный менеджер не пострадает - не смог сделать это с прямыми отношениями PPID-PID.
Arcege
Когда графический интерфейс пользователя умирает, сигнал может получить все дерево процессов, а не группа сеансов. Два разных желаемых поведения: убить одно «приложение» (убить firefox и его плагины), а не убить все дочерние процессы (выход из графического интерфейса). Я ожидаю, что аналогичные работы с Emacs и Chrome.
Arcege
13

Я думал, что знаю ответ на этот вопрос, но я написал программу на C, чтобы понять это.

#include <stdio.h>
#include <unistd.h>

int
main(int ac, char **av)
{
        pid_t sid, mypid, pgid, gid;

        mypid = getpid();
        sid = getsid(0);
        pgid = getpgid(0);
        gid = getpgrp();

        printf("PID %d\n", mypid);
        printf("process group ID of session leader: %d\n", sid);
        printf("process group ID: %d\n", pgid);
        printf("process group ID: %d\n", gid);

        if (!fork())
        {
                mypid = getpid();
                sid = getsid(0);
                pgid = getpgid(0);
                gid = getpgrp();

                printf("child PID %d\n", mypid);
                printf("process group ID of session leader: %d\n", sid);
                printf("process group ID: %d\n", pgid);
                printf("process group ID: %d\n", gid);

                _exit(0);
        }

        return 0;
}

Я скомпилировал его с cc -g -o sid sid.c помощью нескольких разных способов, чтобы увидеть, что происходит:

./sid
nohup ./sid > sid.out
setsid ./sid

Я был немного удивлен тем, что Linux (2.6.39) вернул. Я также нашел справочную страницу раздела 7 «Учетные данные».

Мой совет - сделать man 7 credentials(или эквивалент, если не в Linux) и прочитать раздел о группе процессов и сеансе, чтобы узнать, сможете ли вы разобраться в этом.

Брюс Эдигер
источник
1
Будучи новичком в Linux, я не мог разобрать, что ты сказал. Похоже, вы тоже озадачены? Но вы, вероятно, достаточно осведомлены, чтобы понять, что имел в виду ответ Арсежа. Если да, можете ли вы объяснить то же самое с большей ясностью?
its_me
Интересно ... спасибо ... Так, идентификатор сеанса (SID) является терминал PID для ./sidи nohup ./sid, и при запуске setsid ./sid, то идентификатор сеанса (SID) является новым и так же , как процесс PID ... I» Я не уверен, почему nohup предотвратил форк (или, кажется,
сделал это