Linux에서 PID 재사용 가능성

Linux에서 PID 재사용 가능성

Linux 운영 체제에서 PID를 재사용할 수 있습니까?

예를 들어 PID 이름은 2252입니다. PID가 무효화되고 커널 프로세스 테이블에서 제거됩니다. 프로세스 테이블이 새 프로세스에 동일한 PID를 재사용할 수 있습니까? 아니면 향후 프로세스에서는 사용되지 않습니까?

답변1

틀림없이. 그렇지 않으면 시스템은 시작 시 32768개의 프로세스(또는 시스템의 최대 PID 수)만 실행할 수 있습니다.

프로세스가 종료되고 대기 중인 한(상위 또는 하위 reaper에 의해 또는 상위 프로세스가 종료된 경우 init에 의해) 해당 pid는 재사용될 수 있습니다.

스크립트가 다음을 수행하는 것을 볼 수 있습니다.

cmd1 & pid1=$!
something else
cmd2 & pid2=$!
more things
kill "$pid1" "$pid2"

쉘(대부분의 쉘) 언어는 하위 프로세스를 처리하기 위한 더 나은 API를 제공하지 않기 때문에 이는 대략적인 것입니다.

이러한 프로세스가 종료된 경우 이전에 시작된 프로세스가 계속 참조된다는 $pid1보장 이 없습니다 . 또한 동일할 수도 있습니다( 처음에 이미 죽은 경우). 따라서 잘못된 프로세스가 종료될 수 있습니다.$pid2$pid1$pid2cmd1cmd2kill

실제로 이는 거의 문제가 되지 않습니다. 특히 pid가 순차적으로 할당되는 시스템에서는 pid 번호를 래핑하는 데 상당한 시간이 걸리기 때문입니다. 그러나 pid 테이블이 가득 차면(예: 좀비 프로세스로 가득 차면) 일부 공격자는 이를 악용할 수 있습니다.

답변2

예, 재사용할 수 있습니다. Stéphane Chazelas의 답변에 추가하면 다음과 같습니다.

예를 들어 스크립팅에 이것이 필요한 경우 kill $PID$PID를하나의자식 프로세스이고 올바른 프로세스를 종료하고 있는지 확신할 수 없다면 적어도 bash에서는 다음과 같이 $PID가 있는 프로세스가 현재 쉘의 자식인지 확인할 수 있습니다.

if grep -qFx $PID <(jobs -rp); then
   kill $PID
fi

이는 jobs -rpsubPID를 인쇄하고 grep -qFx $PID$PID가 일치하면 0을 반환합니다.

차별화가 필요할 때하나의다른 시스템 프로세스의 하위 프로세스입니다. 하지만 구별하고 싶다면많은 종류의현재 셸의 하위 항목에 대해 각 하위 항목이 종료될 때 현재 셸에 알리고 싶을 수 있습니다. 예를 들어:

{
    trap "echo $BASHPID >> exited" EXIT
    # some long action
} &

여기서 하위 프로세스가 종료되면 해당 PID를 파일에 씁니다 exited. 메인 프로세스는 특정 PID를 가진 프로세스가 종료되기 전에 종료되었는지 확인할 수 있습니다.

노트. 하위 프로세스가 종료될 때마다 SIGCHLD 신호가 현재 쉘로 전송됩니다. 이는 프로세스를 최적화하는 데 사용될 수 있습니다(예 trap "something..." SIGCHLD:)

관련 정보