
Возможно ли это вообще узнать? Может быть, необходимо провести какие-то тесты, чтобы найти эту информацию?
Моя система, сразу после входа в систему, похоже, уже обернула 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 64bit, ноОтвет РамешаВы можете обнаружить, что это не будет работать в вашей системе, если назначенный pid новому процессу является случайным.
решение3
Естьпроблема xyчто здесь нужно рассмотреть? В вопросе упоминается
все еще живой pid получил тот же pid старого процесса (что портит один из моих скриптов...)
Как это портит скрипты? Это потому, что вы записываете PID процесса в файл, но позже оказывается, что этот процесс завершился, и теперь некоторые другие скрипты ссылаются на «неправильный» PID?
Кроме того, все номера PID уникальны (см. цитату в ответе Рамеша).