Ho riscontrato un problema strano in cui un ps -o args -p <pid>
comando molto occasionalmente non riesce a trovare il processo in questione, anche se è sicuramente in esecuzione sul server in questione. I processi in questione sono script wrapper di lunga durata utilizzati per avviare alcune app Java.
Le occorrenze "in the wild" del problema sembrano sempre accadere nelle prime ore del mattino, per cui v'è qualche evidenza che è legato al carico del disco sul server in questione, perché sono piuttosto pesantemente caricati poi, ma eseguendo il ps
in domanda in un ciclo stretto, alla fine posso replicare il problema - una volta ogni poche centinaia circa di giri ottengo un errore.
Eseguendo il seguente script bash, sono riuscito a generare l'output di strace sia per una corsa fallita che per una riuscita:
while [ $? == 0 ] ; do strace -o fail.out ps -o args -p <pid> >/dev/null ; done ; strace -o good.out ps -o args -p <pid>
Confrontando l'output da fail.out
e good.out
, posso vedere che la getdents
chiamata di sistema in esecuzione che fallisce in qualche modo restituisce un numero molto più piccolo rispetto al conteggio effettivo dei processi sul sistema (nell'ordine di ~ 500 rispetto a ~ 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
... e quell'elenco più breve non include il pid in questione, quindi non è stato trovato.
Puoi ignorare questa sezione, gli errori ENOTTY sono spiegati dal commento di dave_thompson di seguito e non sono correlati
Inoltre, la corsa fallita ottiene alcuni
ENOTTY
errori che non compaiono nella corsa riuscita. Vedo all'inizio dell'output che vedoioctl (1, TIOCGWINSZ, 0x7fffe19db310) = -1 ENOTTY (ioctl inappropriato per dispositivo) ioctl (1, TCGETS, 0x7fffe19db280) = -1 ENOTTY (ioctl inappropriato per dispositivo)
E alla fine ne vedo uno singolo
ioctl (1, TCGETS, 0x7fffe19db0d0) = -1 ENOTTY (ioctl inappropriato per il dispositivo)
Il fallimento
ioctl
alla fine si verifica subito prima deips
ritorni, ma si verifica dopo cheps
ha già stampato un set di risultati vuoto, quindi non sono sicuro che siano correlati. So che sono coerenti in tutti gli output di strace falliti che ho, ma non compaiono in quelli di successo.
Non ho assolutamente idea del perché di getdents
tanto in tanto non trovo l'elenco completo dei processi, e ora ho raggiunto il punto in cui ho intenzione di schiaffeggiare un cerotto sull'intera cosa cambiando lo script di controllo che controlla lo script wrapper in questione di chiamare la ps
seconda volta se la prima fallisce, ma sarei interessato a sapere se qualcuno ha qualche idea di cosa sta succedendo qui.
Il sistema in questione esegue il kernel 4.16.13-1.el7.elrepo.x86_64 su CentOS 7 e procps-ng versione 3.3.10-17.el7_5.2.x86_64
>/dev/null
l'invocazione "fallita" (nel ciclo) ma non l'invocazione "buona", quindi l'ENOTTY del 1 °