как определить, сколько раз pid_max был обернут?

как определить, сколько раз pid_max был обернут?

Возможно ли это вообще узнать? Может быть, необходимо провести какие-то тесты, чтобы найти эту информацию?

Моя система, сразу после входа в систему, похоже, уже обернула max_pid, поэтому все еще живой pid получил тот же pid старого процесса (что портит один из моих скриптов...)! Я пытаюсь понять, что происходит, и есть ли какой-то обходной путь для этого...

мой /proc/sys/kernel/pid_max32768

решение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 уникальны (см. цитату в ответе Рамеша).

Связанный контент