Ciao a tutti!

Domanda: come posso recuperare le informazioni di un processo dato il PID? In particolare mi servirebbe il nome del file PHP.
Il processo non è stato avviato con proc_open(), quindi non posso usare proc_get_status().

Ho la seguente situazione:

· script PHP lanciato da browser
· lo script gira per un tempo indefinito (fino a quando termina tutte le sue simpatiche operazioni) indipendentemente dalla chiusura browser.
· intanto recupero il PID, creo un link col PID in get, lo stampo a video e me invio anche via mail.
· a distanza di ore posso cliccare sul link o controllare la mail ed interrompere il processo se lo ritengo necessario

Fin qui funziona tutto.

Volevo però avere la certezza che quando faccio il kill del processo tramite il PID, questo sia effettivamente il processo lanciato in precedenza.
Temo che magari a distanza di ore (anche parecchie), un processo diverso possa assumere un id utilizzato in precedenza da uno script già terminato. E' possibile?

Comunque, riesco ad ottenere la lista dei processi con shell_exec('ps -F -e'), faccio un bel parsing e recupero la riga contenente il mio PID. Quello che ottengo è che il CMD non è il nome del mio file ma:
/usr/sbin/apache2 -k start

Ecco parte dello script:

Codice PHP:
<?php
# ignora stop (involontario) dell'utente e continua a lavorare
ignore_user_abort(true);
ini_set('memory_limit''1024M');
set_time_limit(0);
ini_set('max_execution_time''NONE');

define('KILL_PROCESS_SUCCESS''Process with id "%s" successfully killed.');
define('KILL_PROCESS_ABORT''Errors occurred trying to kill process with id "%s".');

ob_implicit_flush(true);

if (isset(
$_GET['PID']) && $_GET['PID']!='') {
        
$PID $_GET['PID'];
    try {
        
# recupera la lista dei processi
        
$command "ps -F -e";
        
$processes shell_exec($command);
        
# trasforma in array
        
$processes preg_split('%[\r\n]+%is'$processes);
        
        if (
is_array($processes) && sizeof($processes)) {
            
# recupera i nomi dei campi
            
$fieldspreg_split('%[\t\s]+%'$processes[0], 11);
        }
        
        
# ricrea l'array dei processi
        
$newProcesses = array();
        for (
$i=1$i<sizeof($processes); $i++) {
            
$tempResult preg_split('%[\t\s]+%'$processes[$i], sizeof($fields));
            if (
sizeof($tempResult) == sizeof($fields)) {
                
$newProcess = array();
                foreach(
$tempResult as $key => $value) {
                    
$newProcess[$fields[$key]] = $value;
                }
                
# $tempResult[1] should be PID
                
sizeof($newProcess)?($newProcesses[$tempResult[1]] = $newProcess):NULL;
            }
        }
        
$processes $newProcesses;
        unset(
$newProcesses);
        
        
# stampo a video il nome del processo
        
if (array_key_exists($PID$processes)/* && strpos(__FILE__, $processes[$PID]['CMD'])!==false*/) {
            
# qui non mi restituisce il nome del file ma solo il fatto che apache sta lavorando
            
echo $processes[$PID]['CMD'] . " esiste!
\n"
;
        }

        
# provo ad interrompere il processo (per ora indipendentemente dal controllo precedente)
        
if (shell_exec("kill -KILL " $PID)) {
            throw new 
Exception(sprintf(KILL_PROCESS_SUCCESS$PID));            
        } else {
            throw new 
Exception(sprintf(KILL_PROCESS_ABORT$PID));
        }
    } catch (
Exception $e) {
        echo 
$e->getMessage();
    }
    exit;
}

$PID getmypid();
echo 
"My PID is: $PID. <a href=\"?PID=$PID\" title=\"Kill me!\">Kill me!</a>
\n"
;

# lo script continua...
# operazioni varie...

?>
Grazie!