이것을 아는 것이 가능합니까? 이 정보를 찾으려면 일종의 테스트를 수행해야 합니까?
로그인한 후 내 시스템이 max_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_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 번호는 고유합니다(Ramesh의 답변 인용문 참조).