como determinar quantas vezes pid_max embrulhado?

4

É possível saber isso? pode haver algum tipo de teste a ser realizado para encontrar essa informação?

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

meu /proc/sys/kernel/pid_max é 32768

    
por Aquarius Power 12.06.2014 / 23:24

3 respostas

6

Não é possível dizer quantas vezes a quebra pid_max ocorreu. Uma solução alternativa para não encontrar o agrupamento pid_max é aumentar o valor pid_max dentro,

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 até mesmo,

sysctl -w kernel.pid_max=4194303

No entanto, você precisa investigar se existem alguns processos que estão atualmente utilizando a memória.

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

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

De esta resposta,

Most systems simply keep a count of the last PID generated, add one (wrapping at a maximum number such as 65535 or a bit smaller - often the wrap occurs at 65000 or even 60000), and check that the number is not currently in use (repeating if the PID is still in use - so PID 1, the kernel, is still there and doesn't get 'reissued').

Other security minded systems generate a number at random and check that it is not in use.

At any given time, it is guaranteed that all PID numbers are unique.

Portanto, mesmo que pid_max seja alcançado, você ainda pode ter alguns pids que não estão sendo usados no momento e, portanto, o sistema ainda pode usar esses pids. De acordo com o que eu sei, a única vez que você pode saber que você está sem pids é quando você encontra um erro como este comentário diz,

If you have processes > pid_max, you get error message like "No more processes...

    
por 12.06.2014 / 23:50
1

Este código é possivelmente preciso o suficiente para 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 o pidMax for aumentado além do pidPrev, ele falhará.
Se o atraso do sono for muito alto, poderá falhar também.
Ele deve estar em execução quando a máquina for iniciada e não deve ser interrompido / reiniciado ou a contagem perderá seu significado.

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

    
por 13.06.2014 / 02:38
1

Existe um problema xy que precisa ser tratado aqui? Na questão, é mencionado

a still alive pid got the same pid of an old process (what messes one of mine scripts...)

Como isso atrapalha os roteiros? É porque você está escrevendo o PID de um processo para um arquivo, mas depois 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).

    
por 13.06.2014 / 04:25