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