como determinar quantas vezes o pid_max foi empacotado?

como determinar quantas vezes o pid_max foi empacotado?

É mesmo possível saber disso? pode ser necessário realizar algum tipo de teste para encontrar essas informações?

Meu sistema, logo após o login, parece já ter empacotado o max_pid, então um pid ainda ativo obteve o mesmo pid de um processo antigo (o que bagunça um dos meus scripts...)! Estou tentando entender o que está acontecendo e se há alguma solução alternativa para isso ...

meu /proc/sys/kernel/pid_maxé 32768

Responder1

Não é possível dizer quantas vezes o pid_maxenvoltório ocorreu. Uma solução alternativa para não encontrar o pid_maxempacotamento é aumentar o pid_maxvalor interno,

cat /proc/sys/kernel/pid_max

O comando acima permitirá que você saiba o máximo de processos disponíveis em seu sistema. Você pode aumentar o valor max_pid como,

echo 4194303 > /proc/sys/kernel/pid_max

ou mesmo,

sysctl -w kernel.pid_max=4194303

No entanto, você precisa investigar se há alguns processos que estão utilizando a memória no momento.

Você pode executar um ps -Aoups -e para ver quais processos estão utilizando a memória do seu sistema.

Por que não é possível determinar o envoltório?

Deesseresponder,

A maioria dos sistemas simplesmente mantém uma contagem do último PID gerado, adiciona um (agrupando em um número máximo como 65535 ou um pouco menor - geralmente o encapsulamento ocorre em 65.000 ou mesmo 60.000) e verifica se o número não está em uso no momento ( repetindo se o PID ainda estiver em uso - então o PID 1, o kernel, ainda está lá e não é 'reemitido').

Outros sistemas preocupados com a segurança geram um número aleatoriamente e verificam se ele não está em uso.

A qualquer momento, é garantido que todos os números PID sejam únicos.

Então, mesmo quepid_max seja alcançado, você ainda poderá ter alguns pids que não estão sendo usados ​​no momento e, portanto, o sistema ainda poderá usar esses pids. Pelo que eu sei, o único momento em que você pode saber que está sem pids é quando encontra um erro como esteComentediz,

Se você tiver processos > pid_max, receberá uma mensagem de erro como "Não há mais processos...

Responder2

Este código é possivelmente preciso o suficiente para as situações mais comuns:

#!/bin/bash
count=0;pidPrev=0;
while true;do
    echo -n & pidMax=$!;
    if((pidMax<pidPrev));then
        ((count++));
    fi;
    pidPrev=$pidMax;
    echo "$count,$pidMax";
    sleep 1;
done

Possíveis falhas:
Se pidMax for aumentado além de pidPrev, ele falhará.
Se o atraso no sono for muito alto, ele também poderá falhar.
Ele deve estar funcionando quando a máquina é iniciada e não deve ser parado/reiniciado ou a contagem perderá seu significado.

Limitações:
Este script funcionou aqui, no Ubuntu 14.04 64bits, mas porA resposta de Rameshvocê pode descobrir que não funcionará no seu sistema, caso o pid atribuído a um novo processo seja aleatório.

Responder3

Existe umproblema xyque precisa ser abordado aqui? Na pergunta é mencionado

um pid ainda vivo obteve o mesmo pid de um processo antigo (o que bagunça um dos meus scripts...)

Como isso atrapalha os scripts? É porque você está gravando o PID de um processo em um arquivo, mas mais tarde acontece que o processo foi concluído e agora alguns outros scripts estão fazendo referência ao PID "errado"?

Além disso, todos os números PID são únicos (veja a citação na resposta de Ramesh).

informação relacionada