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 psin 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.oute good.out, posso vedere che la getdentschiamata 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
ENOTTYerrori 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
ioctlalla fine si verifica subito prima deipsritorni, ma si verifica dopo chepsha 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 getdentstanto 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 psseconda 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/nulll'invocazione "fallita" (nel ciclo) ma non l'invocazione "buona", quindi l'ENOTTY del 1 °