Como os PIDs são atribuídos no RHEL7 e são reutilizados após uma reinicialização?

1

Como PIDs é atribuído em RHEL7?
Qual é a probabilidade de que um PID usado antes da inicialização seja atribuído a um processo após a reinicialização?

Em outras palavras, quão estatisticamente concebível é - em RHEL7 - que o mesmo PID seria atribuído a um processo que inicia após a reinicialização de uma máquina, que é idêntico a um PID que foi usado antes do reinicialize.

Editar:

Exemplo: antes da reinicialização, há o daemon A com o PID 544, a máquina é reinicializada e, após a reinicialização, o daemon A é iniciado e recebe o PID 544.

    
por boardrider 31.01.2018 / 20:37

3 respostas

2

Se o sistema init é determinístico, é muito provável que os daemons iniciados pelo sistema init iniciem com o mesmo pid através de reinicializações, já que o mesmo código será executado em cada inicialização (embora com aleatorização do ocasional fsck ou selinux de rotulagem ou outro código não-em-todo-inicial).

No entanto, systemd no RHEL7 não é determinístico: os PIDs são alocados em sequência, mas systemd executa tarefas em paralelo possivelmente em vários núcleos, possivelmente aguardando vários serviços de hardware ou de rede. Vamos ver o que acontece antes e depois na lista de processos:

$ 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
$ 

Portanto, são dois processos (exceto os óbvios não-aleatórios "PID eins" e os encadeamentos do kernel marcados com [ ) com o mesmo PID. Em 30 reinicializações que registram a mesma informação, parece que systemd é muito bom em randomizar os pids; durante esses reinícios /usr/lib/systemd/systemd-logind apareceu em:

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%

Os dados foram capturados com um serviço de inicialização:

[Unit]
Description=recordpidorder
After=getty.target

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

[Install]
WantedBy=multi-user.target

que foi executado:

#!/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

Quando o sistema estiver ativo e em execução, a ordem de criação do processo será randomizada como não-at- @reboot cron jobs, login e execução de vários comandos diferentes, etc. Isso dependerá do sistema, quantos PIDs serão criados sobre isso, etc.

Então, sim, é estatisticamente possível que um daemon apareça no mesmo PID em um sistema RedHat que use systemd . No entanto, as probabilidades variam dependendo do hardware e dos serviços exatos que o sistema oferece.

    
por 31.01.2018 / 21:17
1

Resposta curta

100%

(Eu não estou sugerindo que será a mesma imagem, embora o init seja sempre PID = 1. Apenas que, depois que um processo morrer, em algum momento seu PID será reutilizado.)

Resposta mais longa

Eles podem ser reutilizados antes da reinicialização. Eles contam até que todos os PIDs possíveis sejam usados, em seguida, iniciam novamente, evitando os que estão em uso.

Na reinicialização, eles reiniciam em 1 (o processo init é sempre 1).

Esta é uma resposta geral que deve ser verdadeira para TODOS os Unixs.

    
por 31.01.2018 / 20:42
0

Existe uma certeza de 100% de que um determinado PID será reutilizado após a reinicialização, mas não há garantia de que um determinado programa obterá o mesmo PID após uma reinicialização antes da reinicialização (e na maioria dos casos, não vai).

O Linux, como outros sistemas UNIX, usa um método dead-simple para descobrir qual PID um processo recém-criado possui, ele pega o próximo em ordem numérica após o PID utilizado para o último processo iniciado que não está em usar. Quando atinge o limite especificado por /proc/sys/kernel/pid_max , começa em 1 novamente. Observe que este sysctl é sintonizável pelo usuário, mas, de uma perspectiva prática, limita o número total de processos no sistema.

Agora, há algumas exceções específicas a essa regra. Na inicialização, qualquer que seja seu sistema como init (systemd por padrão no RHEL, mas você pode especificar um binário arbitrário na linha de comando do kernel) é sempre iniciado como PID 1. No Linux especificamente, PID 2 é sempre kthreadd , que é o processo principal do kernel responsável por iniciar todos os outros encadeamentos do kernel, e muitos encadeamentos do kernel que são iniciados muito cedo frequentemente terão o mesmo PID nas reinicializações também ( por exemplo, o PID 4 quase sempre será o thread do manipulador softirq para a CPU 0 em sistemas x86), mas isso depende da configuração de hardware do sistema.

    
por 31.01.2018 / 21:29