pid_max가 몇 번 포장되었는지 확인하는 방법은 무엇입니까?

pid_max가 몇 번 포장되었는지 확인하는 방법은 무엇입니까?

그것을 아는 것이 가능합니까? 해당 정보를 찾으려면 어떤 종류의 테스트를 수행해야 합니까?

내 시스템은 로그인 직후 이미 max_pid를 래핑한 것 같습니다. 따라서 아직 살아있는 pid는 이전 프로세스와 동일한 pid를 얻었습니다(내 스크립트 중 하나가 엉망이 되었습니다...)! 무슨 일이 일어나고 있는지, 그리고 이에 대한 해결 방법이 있는지 이해하려고 노력하고 있습니다.

내꺼 /proc/sys/kernel/pid_max는 32768이야

답변1

pid_max랩이 몇 번이나 발생했는지 알 수 없습니다 . 포장 이 발생하지 않도록 하는 한 가지 해결 방법은 내부의 가치를 pid_max높이는 것입니다 pid_max.

cat /proc/sys/kernel/pid_max

위 명령은 시스템에서 사용 가능한 최대 프로세스를 알려줍니다. max_pid 값을 다음과 같이 늘릴 수 있습니다.

echo 4194303 > /proc/sys/kernel/pid_max

또는,

sysctl -w kernel.pid_max=4194303

그러나 현재 메모리를 사용하고 있는 일부 프로세스가 있는지 조사해야 합니다.

ps -A또는 중 하나를 실행하여 ps -e현재 시스템 메모리를 사용하고 있는 프로세스를 확인할 수 있습니다.

랩을 결정할 수 없는 이유는 무엇입니까?

에서이것답변,

대부분의 시스템은 단순히 생성된 마지막 PID의 개수를 유지하고 하나를 추가한 다음(65535 또는 약간 더 작은 최대 숫자로 래핑 - 종종 65000 또는 심지어 60000에서 래핑이 발생함) 해당 숫자가 현재 사용 중이 아닌지 확인합니다( PID가 아직 사용 중이면 반복합니다. 따라서 커널인 PID 1은 여전히 ​​존재하며 '재발급'되지 않습니다.

보안을 염두에 둔 다른 시스템에서는 무작위로 숫자를 생성하여 사용 중이 아닌지 확인합니다.

언제든지 모든 PID 번호가 고유하다는 것이 보장됩니다.

따라서 pid_max도달하더라도 현재 사용되지 않는 일부 PID가 여전히 있을 수 있으므로 시스템은 해당 PID를 계속 사용할 수 있습니다. 내가 아는 한, PID가 부족하다는 것을 알 수 있는 유일한 경우는 다음과 같은 오류가 발생할 때입니다.논평말한다,

프로세스 > pid_max가 있는 경우 "더 이상 프로세스가 없습니다..."와 같은 오류 메시지가 표시됩니다.

답변2

이 코드는 대부분의 일반적인 상황에서 충분히 정확할 수 있습니다.

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

가능한 결함:
pidMax가 pidPrev 이상으로 증가하면 실패합니다.
수면 지연이 너무 높으면 실패할 수도 있습니다.
기계가 시작될 때 실행 중이어야 하며 중지/재시작하면 안 됩니다. 그렇지 않으면 카운트가 의미를 잃게 됩니다.

제한사항:
이 스크립트는 Ubuntu 14.04 64비트에서 작동했지만라메쉬의 답변새 프로세스에 할당된 pid가 무작위인 경우 시스템에서 작동하지 않을 수 있습니다.

답변3

거기에 있나요?XY 문제여기서 해결해야 할 문제인가요? 질문에는 언급되어 있습니다.

아직 살아있는 PID가 이전 프로세스와 동일한 PID를 가지고 있습니다. (내 스크립트 중 하나가 엉망이 되는 이유는...)

스크립트가 어떻게 엉망이 되나요? 프로세스의 PID를 파일에 쓰고 있지만 나중에 프로세스가 완료되어 다른 스크립트가 "잘못된" PID를 참조하고 있기 때문입니까?

또한 모든 PID 번호는 고유합니다(Ramesh의 답변 인용문 참조).

관련 정보