[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: