`ps`에서 "세션 리더"란 무엇입니까?

`ps`에서 "세션 리더"란 무엇입니까?

ps -d세션 리더를 제외한 모든 프로세스가 선택되는 세션 리더란 무엇입니까 ?

답변1

Linux에서 각 프로세스에는 다음을 포함하여 여러 ID가 연결되어 있습니다.

  • 프로세스 ID(PID)

    이는 프로세스를 식별하는 임의의 숫자입니다. 각 프로세스에는 고유한 ID가 있지만 프로세스가 종료되고 상위 프로세스가 종료 상태를 검색한 후에는 새 프로세스에서 재사용할 수 있도록 프로세스 ID가 해제됩니다.

  • 상위 프로세스 ID(PPID)

    이는 단순히 문제의 프로세스를 시작한 프로세스의 PID입니다. 상위 프로세스가 하위 프로세스보다 먼저 종료되면 하위 프로세스의 PPID가 다른 프로세스(보통 PID 1)로 변경됩니다.

  • 프로세스 그룹 ID(PGID)

    이는 프로세스 그룹 리더의 PID일 뿐입니다. PID == PGID이면 이 프로세스는 프로세스 그룹의 리더입니다.

  • 세션 ID(SID)

    이것은 세션 리더의 PID일 뿐입니다. PID == SID이면 프로세스가 세션 리더입니다.

세션과 프로세스 그룹은 단순히 여러 관련 프로세스를 하나의 단위로 처리하는 방법입니다. 프로세스 그룹의 모든 구성원은 항상 동일한 세션에 속하지만 세션은 여러 프로세스 그룹을 가질 수 있습니다.

일반적으로 셸은 세션 리더가 되며 해당 셸에서 실행되는 각 파이프는 프로세스 그룹이 됩니다. 이는 쉘이 종료될 때 쉘의 자식을 쉽게 죽일 수 있도록 하기 위한 것입니다. (바라보다출구(3)피투성이의 세부 사항을 얻으십시오. )

리더가 아닌 세션이나 프로세스 그룹의 구성원을 설명하는 특별한 용어는 없다고 생각합니다.

답변2

세션 리더는 세션 ID == 프로세스 ID를 갖는 프로세스입니다. 이것은 인위적인 것처럼 들리지만 세션 ID는 하위 프로세스에 의해 상속됩니다. UNIX/Linux의 특정 작업(예: 시스템 호출 종료 또는 명령 종료로 전송될 때 프로세스 ID를 부정하는 등)은 프로세스 세션에서 작동합니다. 가장 일반적인 용도는 쉘을 종료할 때입니다. 운영 체제는 쉘과 동일한 세션 ID를 가진 모든 프로세스 kill -HUP -$$에 (끊기) 신호를 보냅니다. SIGHUP프로세스를 취소하면 해당 프로세스의 세션 ID가 셸에서 변경되므로 끊기 신호에 응답하지 않습니다. 이것은 데몬이 되는 과정의 일부입니다.

창 관리자/그래픽 환경에서 호출되는 대부분의 프로세스는 시작된 프로그램 중 하나와 동일한 세션 ID를 갖습니다. 이를 통해 운영 체제는 kill -HUP -$$브라우저, 음악 플레이어, Libre Office, IM 클라이언트 등과 같은 모든 프로그램에 대해 동일한 작업을 수행할 수 있습니다. 이러한 프로세스는 세션 리더가 아닙니다.

답변3

나는 이 질문에 대한 답을 알고 있다고 생각했는데, 그것을 해결하기 위해 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가 아닌 경우 이에 상응하는) 프로세스 그룹 및 세션에 대한 섹션을 읽고 이 문제를 해결할 수 있는지 확인하는 것입니다.

관련 정보