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
$pid2
cmd1
cmd2
kill
실제로 이는 거의 문제가 되지 않습니다. 특히 pid가 순차적으로 할당되는 시스템에서는 pid 번호를 래핑하는 데 상당한 시간이 걸리기 때문입니다. 그러나 pid 테이블이 가득 차면(예: 좀비 프로세스로 가득 차면) 일부 공격자는 이를 악용할 수 있습니다.
답변2
예, 재사용할 수 있습니다. Stéphane Chazelas의 답변에 추가하면 다음과 같습니다.
예를 들어 스크립팅에 이것이 필요한 경우 kill $PID
$PID를하나의자식 프로세스이고 올바른 프로세스를 종료하고 있는지 확신할 수 없다면 적어도 bash에서는 다음과 같이 $PID가 있는 프로세스가 현재 쉘의 자식인지 확인할 수 있습니다.
if grep -qFx $PID <(jobs -rp); then
kill $PID
fi
이는 jobs -rp
subPID를 인쇄하고 grep -qFx $PID
$PID가 일치하면 0을 반환합니다.
차별화가 필요할 때하나의다른 시스템 프로세스의 하위 프로세스입니다. 하지만 구별하고 싶다면많은 종류의현재 셸의 하위 항목에 대해 각 하위 항목이 종료될 때 현재 셸에 알리고 싶을 수 있습니다. 예를 들어:
{
trap "echo $BASHPID >> exited" EXIT
# some long action
} &
여기서 하위 프로세스가 종료되면 해당 PID를 파일에 씁니다 exited
. 메인 프로세스는 특정 PID를 가진 프로세스가 종료되기 전에 종료되었는지 확인할 수 있습니다.
노트. 하위 프로세스가 종료될 때마다 SIGCHLD 신호가 현재 쉘로 전송됩니다. 이는 프로세스를 최적화하는 데 사용될 수 있습니다(예 trap "something..." SIGCHLD
:)