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
$fields= preg_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!