processi e /proc e confusione
Salve ragazzi,
tempo fa avevo creato un programmino in C che semplicemente si occupava
di lanciare un determinato programma solo se questo determinato
programma non fosse gia avviato.
Il sistema è una debian Wheezy x86_64.
Per dare una spiegazione piu completa vi riepilogo il caso:
Mio programma lo chiamerò A
Programma lanciato lo chiamero B. Il programma B scrive il proprio pid
su un file chiamato "programma.pid".
Avvio il programma A, controlla se il programma.pid esiste, se non
esiste, avvia programma B, se esiste legge il pid e verifica se il
programma è gia avviato. Se il pid esiste realmente, il programma B non
viene avviato, altrimenti A avvia B.
Il programma viene avviato una prima volta e supponiamo che tutto vada
bene.
Do un kill al Programma A ma B rimane ancora attivo.
Il programma A viene avviato di nuovo, trova il file programma.pid del
programma B (che è ancora attivo), legge il pid al suo interno e
verifica se quel pid esiste realmente in proc. Dato che il pid esiste,
il programma A non avvia di nuovo il programma B.
Do un kill al programma A e programma B (che non cancella il suo
"programma.pid").
Il programma A viene avviato di nuovo, trova il vecchio file
programma.pid del programma B (che ora non è attivo), legge il pid, e
verifica se il pid esiste in proc. E ora comincia il problema. Il
programma A dice che in /proc esiste il pid contenuto nel file
programma.pid del programma B, ma andando in shell e lanciando:
ps aux | grep pid
non ottengo nulla, lanciando:
ls /proc | grep pid
ls /proc (leggendo file per file)
non ottengo nulla.
Se invece provo a dare un:
cd /proc/pid
riesco ad entrare nella dir, se do un
ls *
il contenuto della dir viene listato e vedo la "struttura" del processo,
se lancio un
cat cmdline
ritorna il cmdline del processo. Ho provato con un
ps aux | grep "parte di cmdline"
e ottengo alcuni processi con quel cmdline ma hanno tutti pid diversi da
quello indagato. Ho provato anche un kill pid e funziona regolarmente,
ho provato un secondo kill pid e ritorna che il processo non esiste
(comportamento corretto in quanto era stato killato con il comando
precedente).
Ora tralasciando stare l'implementazione del mio programma, sbagliata o
giusta che sia, non riesco a capire questo tipo di comportamento, in
particolare:
Non capisco perchè un determinato processo non è visibile ne con ps ne
in /proc ma esiste la dir della struttura del processo alla quale si può
accedere tranquillamente.
Ho creato un altro piccolo programma, in modo tale che mi restituisca
una lista di tutti i processi che hanno questo comportamento (non
visibili ma la dir del pid in /proc esistente e accessibile), e devo
dire che ne risultano diversi.
Per esempio il processo 3921 non è visibile ma la /proc/3921 esiste e il
cmdline punta ad una macchina virtuale avviata.
Oppure il processo 1612 con cmdline uguale a icedove mentre con
ps aux | grep icedove
1000 32399 1.3 0.9 904748 148900 tty1 Sl 15:14 0:41 icedove
Ho provato anche su un altro sistema fresco fresco di installazione
(slackware64 14.1) e rilevo lo stesso comportamento.
Qualcuno ha qualche idea al riguardo? Possibile che il sistema tratta i
thread dei processi assegnandogli cmq un pid ma non trattandoli come
processi?
Aiuto.
(spero di essere stato chiaro - scusate la lunghezza)
Un saluto, Alessandro.
Reply to: