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

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

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

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

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

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

    Это всего лишь PID процесса, который запустил этот процесс.

  • Идентификатор группы процессов (PGID)

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

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

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

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

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

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

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

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

Я думал, что знаю ответ на этот вопрос, но я написал программу на 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), и прочитать раздел о группе процессов и сеансе, чтобы узнать, можете ли вы это решить.