짧은 답변

짧은 답변

시작 전에 사용된 프로세스를 할당하는 방법 PIDs재시작 후 프로세스에 할당될 RHEL7?
확률은 얼마입니까 ?PID

즉, 시스템 재부팅 후 시작된 프로세스( 재부팅 ​​전에 사용했던 것과 동일한 프로세스) 에 RHEL7동일한 프로세스를 할당하는 것이 통계적으로 얼마나 가능합니까?PIDPID

편집하다:

예:재부팅하기 전에는 PID 544를 갖는 데몬 A가 있었고 머신은 재부팅되었으며 재부팅 후 데몬 A가 시작되어 PID 544가 할당되었습니다.

답변1

init 시스템이 결정적이라면 해당 init 시스템에 의해 시작된 데몬은 재부팅 시 동일한 pid로 시작될 가능성이 높습니다. 왜냐하면 동일한 코드가 부팅할 때마다 실행되기 때문입니다(비록 가끔 무작위화나 fsck재표 selinux시 등이 있지만). -) 코드를 시작할 때마다).

그러나 RHEL7에서는 systemd비결정적입니다. PID는 순차적으로 할당되지만 systemd작업은 여러 코어에서 병렬로 실행될 수 있으며 다양한 하드웨어 또는 네트워크 서비스를 기다릴 수도 있습니다. 프로세스 목록 전후에 무슨 일이 일어나는지 살펴보겠습니다.

$ ps axo pid,command | sort -n > before
$ sudo reboot
...
$ ps axo pid,command | sort -n > after
$ comm -12 before after | grep -v \\[
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
  PID COMMAND
    1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
  745 /usr/lib/systemd/systemd-logind
  864 /usr/sbin/NetworkManager --no-daemon
$ 

[따라서 이들은 동일한 PID를 가진 두 프로세스입니다(명백한 무작위가 아닌 "PID eins" 및 레이블이 지정된 커널 스레드 제외). 30번의 재부팅을 통해 거의 동일한 정보가 기록되었으며, systemd이러한 재부팅 중에 pid를 무작위로 지정하는 데 매우 유용한 것 /usr/lib/systemd/systemd-logind같습니다.

PID PERCENTAGE
733 5%
734 5%
737 15%
739 5%
743 5%
746 5%
748 5%
749 5%
752 10%
753 10%
755 5%
758 5%
760 5%
764 5%
771 5%
773 5%

서비스를 시작하면 데이터가 캡처됩니다.

[Unit]
Description=recordpidorder
After=getty.target

[Service]
Type=oneshot
ExecStart=/root/pidandboots

[Install]
WantedBy=multi-user.target

달리다:

#!/bin/bash
NF=/root/sequence
[[ ! -e "$NF" ]] && echo 0 > "$NF"
CUR=$(( 1 + $(< "$NF") ))
ps haxo pid,command > "/root/pidorder$CUR"
[[ $CUR -gt 30 ]] && mv /root/pidandboots /root/pidandboots.done
echo "$CUR" > "$NF"
reboot

@reboot시스템이 시작되어 실행되면 크론이 아닌 작업이 실행되고 사용자가 로그인하여 다양한 명령을 실행하는 등 프로세스 생성 순서가 무작위로 지정됩니다 . 이는 시스템, 시스템에 생성된 PID 수 등에 따라 달라집니다.

그렇습니다. 데몬이 사용된 RedHat 시스템에서 동일한 PID로 나타날 것이라는 것은 통계적으로 생각할 수 있습니다 systemd. 그러나 확률은 시스템에서 제공하는 하드웨어 및 특정 서비스에 따라 다릅니다.

답변2

짧은 답변

100%

(init가 항상 PID=1을 가지더라도 동일한 이미지가 될 것이라는 말은 아닙니다. 단지 프로세스가 종료된 후 어느 시점에서 해당 PID가 재사용된다는 것입니다.)

더 긴 답변

다시 시작하기 전에 다시 사용할 수 있습니다. 가능한 모든 PID가 사용될 때까지 계산된 다음 사용 중인 PID를 피하면서 다시 시작합니다.

재부팅 시 1에서 다시 시작됩니다(프로세스 초기화는 항상 1입니다).


이것은 모든 Unix에 적용되는 일반적인 답변입니다.

답변3

주어진 PID가 재부팅 후에 재사용된다는 것은 100% 확실하지만, 주어진 프로그램이 재부팅 전과 동일한 PID를 재부팅 후에도 얻게 될 것이라는 보장은 없습니다(그리고 대부분의 경우 그렇지 않습니다). .

다른 UNIX 시스템과 마찬가지로 Linux는 새로 생성된 프로세스의 PID를 결정하기 위해 매우 간단한 방법을 사용합니다. 이는 이전에 사용되지 않은 프로세스가 시작된 PID 다음에 숫자 순서로 다음 프로세스를 가져오는 것입니다. 지정된 상한에 도달하면 /proc/sys/kernel/pid_max다시 1부터 시작됩니다. 이 sysctl은 사용자가 조정할 수 있지만 실제적인 관점에서는 시스템의 총 프로세스 수만 제한합니다.

이제 이 규칙에는 몇 가지 구체적인 예외가 있습니다. 부팅할 때 시스템이 사용하는 것은 무엇이든 init(RHEL에서는 기본적으로 systemd가 사용되지만 커널 명령줄에서 임의의 바이너리를 지정할 수 있습니다)언제나PID 1로 시작합니다. 특히 Linux에서는 PID 2가언제나 kthreadd, 다른 모든 커널 스레드를 시작하는 역할을 담당하는 핵심 커널 프로세스이며 매우 일찍 시작된 많은 커널 스레드도 일반적으로 다시 시작한 후 항상 동일한 PID를 갖습니다. 예를 들어 PID 4는 거의 항상 x86 시스템의 Softirq 핸들러 스레드입니다. CPU 0), 이는 시스템의 하드웨어 구성에 따라 다릅니다.

관련 정보