
É 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_max
envoltório ocorreu. Uma solução alternativa para não encontrar o pid_max
empacotamento é aumentar o pid_max
valor 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 -A
oups -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).