Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    PHP/Linux - Recupero info processo dato il PID

    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!
    Michele
    King Of The Kill

  2. #2
    intanto per sapere se il processo è ancora in esecuzione è inutile che ti parsi tutti i processi, basta

    codice:
    ps -F -p $PID_DEL_PROCESSO
    per sapere se effettivamente l'hai killato, subito dopo il kill rifai ps col pid e vedi, se torna risultati non è morto, altrimenti è morto.

    i pid dovrebbero essere incrementanti (ma non ci metto la mano sul fuoco)...cioè se noti i processi che partono all'avvio della macchina hanno in genere un pid molto basso, mentre gli ultimi molto alto...così che se tu uccidi un processo con pid basso e lo riavvii avrai un pid molto alto, un pò come se prendesse l'ultimo pid che ha dato e lo incrementasse di 1... Però ripeto, è una mia supposizione non so di preciso...

    cmq io metterei il tuo script in un file batch php e poi richiamerei quello, piuttosto che far inchiodare apache su quella pagina... in maniera che poi lo richiami con ./tuo_file.php e in ps troverai non più /httpd.. ma tuo_file.php. Ovviamente la pagina web rarà una exec per avviare il processo o come ti pare a te e il ritorno dell'exec farai che sia il pid...qualcosa del genere insomma

    spero di esser stato chiaro
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    La questione dei PID crescenti: pur trattandosi di un server remoto sempre (o quasi) acceso, ho potuto notare che gli ID dei processi non sono mai troppo elevati.
    Questo implica che ad un certo punto vengono riutilizzati quelli vecchi, suppongo...

    Per il resto, tutto chiaro!
    Appena riesco provo a fare qualche test.

    Grazie! Ciao!
    Michele
    King Of The Kill

  4. #4
    qualche link magari di gente che ne sa un'anticchia più di me:

    http://stackoverflow.com/questions/3...e-the-next-pid

    http://superuser.com/questions/13500...pids-generated

    da cui un estratto:

    Under Unix, process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at zero and again increases. However, for this and subsequent passes any PIDs still assigned to processes are skipped.
    per questo i pid non ti sembrano mai molto elevati
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Grande!
    Non si finisce mai di imparare...
    Michele
    King Of The Kill

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.