Me he encontrado con un problema extraño en el que un ps -o args -p <pid>
comando muy ocasionalmente no puede encontrar el proceso en cuestión, aunque definitivamente se está ejecutando en el servidor en cuestión. Los procesos en cuestión son scripts de reinicio de larga duración utilizados para iniciar algunas aplicaciones Java.
Las ocurrencias "en estado salvaje" de la cuestión siempre parecen ocurrir temprano en la mañana, por lo que hay cierta evidencia de que se ha relacionado con la carga de disco en el servidor en cuestión, porque están muy fuertemente cargados entonces, pero ejecutando el ps
en pregunta en un bucle cerrado, eventualmente puedo replicar el problema: una vez cada cientos de ejecuciones obtengo un error.
Al ejecutar el siguiente script bash, he logrado generar resultados extraños tanto para una ejecución fallida como exitosa:
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
Comparando el resultado de fail.out
y good.out
, puedo ver que la getdents
llamada del sistema en la ejecución que falla de alguna manera devuelve un número mucho menor que el recuento real de procesos en el sistema (del orden de ~ 500 en comparación con ~ 1100)
grep getdents good.out
getdents(5, /* 1174 entries */, 32768) = 32760
getdents(5, /* 31 entries */, 32768) = 992
getdents(5, /* 0 entries */, 32768) = 0
grep getdents fail.out
getdents(5, /* 673 entries */, 32768) = 16728
getdents(5, /* 0 entries */, 32768) = 0
... y esa lista más corta no incluye el pid real en cuestión, por lo que no se encuentra.
Puede ignorar esta sección, los errores ENOTTY se explican por el comentario de dave_thompson a continuación, y no están relacionados
Además, la ejecución fallida obtiene algunos
ENOTTY
errores que no aparecen en la ejecución exitosa. Cerca del comienzo de la salida veoioctl (1, TIOCGWINSZ, 0x7fffe19db310) = -1 ENOTTY (ioctl inapropiado para dispositivo) ioctl (1, TCGETS, 0x7fffe19db280) = -1 ENOTTY (ioctl inapropiado para dispositivo)
Y al final veo un solo
ioctl (1, TCGETS, 0x7fffe19db0d0) = -1 ENOTTY (ioctl inapropiado para el dispositivo)
El error
ioctl
al final ocurre justo antes de lasps
devoluciones, pero ocurre después de queps
ya ha impreso un conjunto de resultados vacío, por lo que no estoy seguro de si están relacionados. Sé que son consistentes en todos los resultados de strace fallidos que tengo, pero no aparecen en los exitosos.
No tengo absolutamente ninguna idea de por getdents
qué ocasionalmente no encontraría la lista completa de procesos, y ahora he llegado al punto en el que solo voy a aplicar una curita en todo el asunto cambiando el script de control que verifica el script de envoltura en cuestión para llamar por ps
segunda vez si falla la primera, pero me interesaría saber si alguien tiene alguna idea de lo que está sucediendo aquí.
El sistema en cuestión ejecuta Kernel 4.16.13-1.el7.elrepo.x86_64 en CentOS 7 y procps-ng versión 3.3.10-17.el7_5.2.x86_64
>/dev/null
en la invocación 'falla' (en el bucle) pero no la invocación 'buena', de ahí la ENOTTY en fd 1.