별도의 PID 네임스페이스에 있는 자식 프로세스의 PID를 찾을 수 있나요?
상위 네임스페이스를 기준으로 하위 프로세스 PID를 얻을 수 있지만 하위 프로세스가 현재 실행 중인 별도의 PID 네임스페이스를 기준으로 하위 프로세스의 PID를 찾아야 합니다.
IPC를 통해 하위 프로세스에서 PID를 얻을 수 있지만 하위 프로세스의 도움 없이 이를 찾을 수 있는 방법이 있습니까?
답변1
프로세스의 PID가 주어지면 해당 프로세스가 속한 모든 PID 네임스페이스에 대한 정보를 얻을 수 있습니다.프로세스 항목존재하다 /proc/PID/status
:
NStgid descendant namespace thread group ID hierarchy
또는에서man proc
:
NStgid: [pid]가 속한 네임스페이스의 스레드 그룹 ID(예: PID)입니다. 가장 왼쪽 항목에는 상대 항목이 표시됩니다.프로세스의 PID 네임스페이스 읽기, 이어서연속적으로 중첩된 내부 네임스페이스의 값. (리눅스 4.1부터.)
를 사용하는 것 외에 /proc
이 정보를 검색할 수 있는 다른 방법이 있는지 모르겠습니다.
다음은 LXC-within-LXC 컨테이너 내에서 시작되는 휴면 프로세스의 예입니다. 따라서 초기 PID 네임스페이스에서 읽을 때 두 개의 중첩된 PID(일명 tgids)가 있습니다.
# pidof sleep
443701
# grep ^NStgid: /proc/443701/status
NStgid: 443701 685 170
따라서 해당 PID는 중간 네임스페이스에서 685이고 최종 네임스페이스에서 170입니다. 프로세스는 자신의 PID 값이 170인 것으로 간주합니다.
마지막 항목은 프로세스가 자체적으로 표시되는 방식입니다.
상위 프로세스가 최신 clone3(2)
시스템 호출을 사용하지 않고 다른 PID 네임스페이스에서 하위 프로세스를 생성하는 경우 어쨌든 하나의 추가 PID 네임스페이스에만 존재하며 해당 pid는 다음 줄의 항목이 됩니다. 세 번째이자 마지막 항목( NStgid:
첫 번째로 계산됨) 기입). 이러한 PID 네임스페이스를 입력하여 확인하는 경우( nsenter(1)
또는 사용) 새 가상 마운트 네임스페이스를 생성하고( 또는 사용 ) 여기에 다시 마운트 setns(2)
해야 합니다 . 그렇지 않으면 항목에 여전히 상위 PID 네임스페이스의 값이 반영됩니다. 변화는 없을 것입니다.unshare(1)
unshare(2)
clone(2)
/proc
/proc
추가 예시는 다음과 같습니다. 이것이 sleep 명령인지 확인하십시오.
# nsenter -t 443701 -p unshare -m --mount-proc ls -l /proc/170/exe
lrwxrwxrwx 1 root root 0 Dec 21 23:03 /proc/170/exe -> /bin/sleep
중간 PID 네임스페이스에 PID 참조가 있습니다(중간 LXC 컨테이너 이름은스트레치-AMD64) 거기에서 어떻게 보이는지 알 수 있습니다.
# lxc-info -Hp -n stretch-amd64
442977
# nsenter -t 442977 -p unshare -m --mount-proc grep ^NStgid: /proc/685/status
NStgid: 685 170
답변2
프로세스에는 여러 하위 프로세스가 있을 수 있습니다. 자식 프로세스의 PID를 얻는 가장 좋은 방법은 자식 프로세스가 생성될 때 얻는 것입니다. 둘 다 성공 fork
시 하위 PID를 반환합니다 clone
.