Що таке "лідери сесій" в "ps"?


78

Що таке лідери сеансу, як в ps -dякому вибираються всі процеси, крім лідерів сесії?

Відповіді:


84

У Linux кожен процес має декілька ідентифікаторів, пов'язаних з ним, включаючи:

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

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

  • Ідентифікатор батьківського процесу (PPID)

    Це лише PID процесу, який розпочав процес, про який йде мова.

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

    Це лише PID лідера групи процесів. Якщо PID == PGID, то цей процес є лідером групи процесів.

  • Ідентифікатор сесії (SID)

    Це лише PID лідера сеансу. Якщо PID == SID, то цей процес є лідером сеансу.

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

Зазвичай оболонка буде лідером сеансу, і кожен конвеєр, виконаний цією оболонкою, буде групою процесів. Це робиться для того, щоб легко вбити дітей снарядом, коли він виходить. (Дивіться вихід (3) для деталей горі.)

Я не думаю, що існує специфічний термін для члена сесії або групи процесів, який не є лідером.


5
Примітка. Використовуйте ps xao pid,ppid,pgid,sid,commдля перегляду цих ідентифікаторів.
Майк R

1
Чому люди не дають більше таких
наочних

24

Ведучий сесії - це процес, коли id сесії == ідентифікатор процесу. Це звучить надумано, але ідентифікатор сеансу успадковується дочірніми процесами. Деякі операції в UNIX / Linux працюють на сеансах процесу, наприклад, відкидаючи ідентифікатор процесу при відправці на виклик або команду kill. Найбільш поширене для цього використання при виході з оболонки. ОС надішле kill -HUP -$$, яка надішле сигнал SIGHUP (зависання) всім процесам з тим же ідентифікатором сеансу, що і оболонка. Коли ви відхилили процес, ідентифікатор сеансу процесу змінюється з оболонки, тому він не реагуватиме на сигнал зависання. Це одна частина процесу перетворення демона.

Більшість процесів, викликаних у вікні / графічному середовищі, мають той самий ідентифікатор сесії, що і одна із програм запуску. Це дозволяє операційній системі виконувати однакові kill -HUP -$$операції у всіх програмах: наприклад, у вашому браузері, музичному плеєрі, libreoffice, клієнті чату тощо. Це процеси, які не є лідерами сеансів.


Будь ласка, не заперечуйте, але мені може знадобитися трохи більше роз'яснень - - ведучий сесії - це один, як називаються інші, і чим вони схожі (поведінка, чим вони відрізняються від керівника сесії)?
its_me

Їх називають учасниками сесії, я вважаю.
Арседж

Мені подобається ваше пояснення, але мені все одно не вистачає одного пункту: IIUC, будь-коли кожен процес, який я розпочав, є насправді дочірньою оболонкою, з якою я увійшов (якщо, звичайно, не відмовився від неї). Чому б ОС не просто ходити по дереву процесів і не вбивати всіх братів і сестер цього процесу та їхніх побратимів? (Насправді, це я завжди думав, що це робиться ... до сьогоднішнього дня: D) Отже, яке обгрунтування слід використовувати замість сеансів?
Алоїз Магдал

Потрібно далеко не визначати, коли процес більше не є частиною початкового сеансу (наприклад, оболонка входу або демон, наприклад). Можна подумати, що автоматично змінити PPID (батьківський під) на 1, але це порушить дерево процесу. Новий ідентифікатор сеансу створює групу, якій можна разом надсилати сигнал. Прикладом цього є GUI, Firefox Firefox як окремий сеанс. Потім, натиснувши кнопку [X], надішліть сигнал сеансу Firefox та його дітей, але менеджер вікон не впливає - не вдалося це зробити при прямих відносинах PPID-PID.
Арседж

Коли GUI вмирає, то все дерево процесу, а не група сеансів, може отримати сигнал. Дві різні бажані форми поведінки: вбивство однієї програми (вбивство Firefox та її плагінів), проти вбивства всіх дочірніх процесів (вихід із gui). Очікуюсь, що подібні роботи з emacs та chrome.
Арседж

13

Я думав, що знаю відповідь на це, але написав програму С, щоб розібратися в цьому.

#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 завадив вилці (або здається), але я думаю, що я маю загальне уявлення ...
Peter.O
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.