
¿Es siquiera posible saber eso? ¿Puede ser necesario realizar algún tipo de prueba para encontrar esa información?
Mi sistema, justo después de iniciar sesión, parece haber incluido el max_pid, por lo que un pid aún vivo obtuvo el mismo pid de un proceso anterior (lo que estropea uno de mis scripts...). Estoy tratando de entender qué está sucediendo y si hay alguna solución para eso...
mi /proc/sys/kernel/pid_max
es 32768
Respuesta1
No es posible saber cuántas veces pid_max
se ha producido la envoltura. Una solución para no encontrar el pid_max
envoltorio es aumentar el pid_max
valor del interior,
cat /proc/sys/kernel/pid_max
El comando anterior le permitirá conocer el máximo de procesos disponibles en su sistema. Puede aumentar el valor max_pid como,
echo 4194303 > /proc/sys/kernel/pid_max
o incluso,
sysctl -w kernel.pid_max=4194303
Sin embargo, es necesario investigar si hay algunos procesos que actualmente estén utilizando la memoria.
Puede ejecutar ps -A
o ps -e
para ver qué procesos están utilizando actualmente la memoria de su sistema.
¿Por qué no es posible determinar la envoltura?
Deesterespuesta,
La mayoría de los sistemas simplemente mantienen un recuento del último PID generado, agregan uno (ajustándolo a un número máximo como 65535 o un poco más pequeño; a menudo el ajuste ocurre en 65000 o incluso 60000) y verifican que el número no esté actualmente en uso ( repitiendo si el PID todavía está en uso, por lo que el PID 1, el núcleo, todavía está allí y no se "reemite").
Otros sistemas centrados en la seguridad generan un número al azar y comprueban que no esté en uso.
En cualquier momento dado, se garantiza que todos los números PID sean únicos.
Entonces, incluso si pid_max
se alcanza, es posible que todavía tenga algunos pids que no se estén usando actualmente y, por lo tanto, el sistema aún puede usar esos pids. Hasta donde yo sé, el único momento en el que puedes saber que no tienes pids es cuando encuentras un error como estecomentariodice,
Si tiene procesos > pid_max, recibirá un mensaje de error como "No más procesos...
Respuesta2
Este código posiblemente sea lo suficientemente preciso para las situaciones más comunes:
#!/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
Posibles defectos:
Si pidMax aumenta más allá de pidPrev, fallará.
Si el retraso del sueño es demasiado alto, también puede fallar.
Debe estar en ejecución cuando se inicia la máquina y no se debe detener/reiniciar o el conteo perderá su significado.
Limitaciones:
Este script funcionó aquí, en Ubuntu 14.04 de 64 bits, pero porLa respuesta de RameshEs posible que no funcione en su sistema, en caso de que el pid asignado a un nuevo proceso sea aleatorio.
Respuesta3
Hay unproblema xy¿Eso debe abordarse aquí? En la pregunta se menciona
un pid aún vivo obtuvo el mismo pid de un proceso antiguo (lo que estropea uno de mis scripts...)
¿Cómo estropea los guiones? ¿Es porque está escribiendo el PID de un proceso en un archivo, pero luego resulta que el proceso se completó y ahora algunos otros scripts hacen referencia al PID "incorrecto"?
Además, todos los números PID son únicos (consulte la cita en la respuesta de Ramesh).