it-swarm-vi.com

"Các nhà lãnh đạo phiên" trong `ps` là gì?

Lãnh đạo phiên là gì, như trong ps -d trong đó chọn tất cả các quy trình ngoại trừ các nhà lãnh đạo phiên?

83
its_me

Trong Linux, mọi quy trình đều có một số ID được liên kết với nó, bao gồm:

  • ID tiến trình (PID)

    [.__.] Đây là một số tùy ý xác định quy trình. Mọi quy trình đều có một ID duy nhất, nhưng sau khi quá trình thoát ra và quy trình cha đã lấy lại trạng thái thoát, ID quy trình được giải phóng để được sử dụng lại bởi một quy trình mới.

  • ID quy trình phụ huynh (PPID)

    [.__.] Đây chỉ là bộ vi xử lý bắt đầu quá trình được đề cập.

  • ID nhóm quy trình (PGID)

    [.___.] Đây chỉ là PID của trưởng nhóm quy trình. Nếu PID == PGID, thì quá trình này là một nhóm trưởng quy trình.

  • ID phiên (SID)

    [.__.] Đây chỉ là PID của người lãnh đạo phiên. Nếu PID == SID, thì quá trình này là một nhà lãnh đạo phiên.

Phiên và nhóm quy trình chỉ là cách để coi một số quy trình liên quan là một đơn vị. Tất cả các thành viên của một nhóm quy trình luôn thuộc về cùng một phiên, nhưng một phiên có thể có nhiều nhóm quy trình.

Thông thường, Shell sẽ là người dẫn đầu phiên và mọi đường ống được Shell thực hiện sẽ là một nhóm quy trình. Điều này là để dễ dàng giết chết những đứa trẻ của Shell khi nó thoát ra. (Xem thoát (3) để biết chi tiết về tin đồn.)

Tôi không nghĩ có một điều khoản đặc biệt cho một thành viên của một phiên hoặc nhóm quy trình không phải là người lãnh đạo.

87
cjm

Một người lãnh đạo phiên là một quá trình trong đó phiên id == process id. Điều này nghe có vẻ khó khăn, nhưng id phiên được kế thừa bởi các tiến trình con. Một số hoạt động trong UNIX/Linux hoạt động trên các phiên quy trình, ví dụ, phủ định id tiến trình khi gửi đến lệnh gọi hoặc lệnh hệ thống tiêu diệt. Việc sử dụng phổ biến nhất cho việc này là khi đăng xuất khỏi Shell. HĐH sẽ gửi kill -HUP -$$, sẽ gửi tín hiệu SIGHUP (gác máy) cho tất cả các quy trình có cùng id phiên với Shell. Khi bạn từ chối một quy trình, id phiên của quy trình được thay đổi từ Shell, do đó, nó sẽ không phản hồi tín hiệu gác máy. Đây là một phần của quy trình để trở thành quy trình daemon.

Hầu hết các quy trình được gọi từ trình quản lý cửa sổ/môi trường đồ họa có cùng id phiên với một trong các chương trình khởi động. Điều này cho phép HĐH thực hiện cùng kill -HUP -$$ hoạt động trên tất cả các chương trình: chẳng hạn như trình duyệt, trình phát nhạc, libreoffice, ứng dụng khách IM, v.v ... Đây là những quy trình không phải là người dẫn đầu phiên.

24
Arcege

Tôi nghĩ rằng tôi biết câu trả lời cho điều này, nhưng tôi đã viết một chương trình C để tìm ra điều này.

#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;
}

Tôi đã biên dịch nó với cc -g -o sid sid.c Tôi đã chạy nó một vài cách khác nhau, để xem điều gì sẽ xảy ra:

./sid
Nohup ./sid > sid.out
setsid ./sid

Tôi đã rất ngạc nhiên bởi những gì Linux (2.6,39) đã trả lại. Tôi cũng tìm thấy trang 7 phần man, "thông tin đăng nhập".

Lời khuyên của tôi là làm man 7 credentials (hoặc tương đương nếu không có trên Linux) và đọc phần về nhóm quy trình và phiên để xem bạn có thể giải đố được không.

13
Bruce Ediger