Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    36

    Interruzione script lanciato con exec o system

    vorrei sapere se e' possibile interrompere l' esecuzione di uno script shell precedentemente lanciato con exec o system, o tuttalpiu' fare in modo che lo script lanciato possa rimanere "in attesa" di un ulteriore input da parte ad esempio di un " button" in modo che lo stoppi
    l' interruzione non e' intesa come emergenza , ma come funzionalita' normale

    volevo chiedervi inoltre se con un bottone html e' possibile far eseguire uno script e mantenerlo in esecuzione fintanto che il bottone rimane premuto con il mouse , utilizzando solo html e php, non java o altro

    grazie mille
    Ultima modifica di digitel; 22-11-2013 a 21:03

  2. #2
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    guarda qui ma occhio a quello che fai

    http://stackoverflow.com/questions/1...nate-a-process
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    36
    Grazie per il link, procedura un po incasinata per me che sono alle prime armi

    Ma la mia domanda e' questa :

    Se l'output di ritorno da uno script shell lanciato da php, lo salvo come variabile, questa variabile la posso passare ad un altro script ??

    Nel mio caso ho fatto questa prova: un tasto per laciare uno script , un altro per killarlo, ma non funziona :

    <?php
    if (isset($_POST['TastoA']))
    {
    $pid = exec("nohup nomescript.sh > /dev/null 2>&1 & echo $!");
    }
    if (isset($_POST['TastoB']))
    {
    shell_exec("kill $pid");
    }
    ?>

    Il log di apache2 mi dice "undefined variable : pid" quando premo il secondo tasto

    Per caso la variabile scompare dopo il primo utilizzo di if(ISSET ???

  4. #4
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,514
    Quote Originariamente inviata da digitel Visualizza il messaggio
    Grazie per il link, procedura un po incasinata per me che sono alle prime armi

    Ma la mia domanda e' questa :

    Se l'output di ritorno da uno script shell lanciato da php, lo salvo come variabile, questa variabile la posso passare ad un altro script ??

    Nel mio caso ho fatto questa prova: un tasto per laciare uno script , un altro per killarlo, ma non funziona :

    <?php
    if (isset($_POST['TastoA']))
    {
    $pid = exec("nohup nomescript.sh > /dev/null 2>&1 & echo $!");
    }
    if (isset($_POST['TastoB']))
    {
    shell_exec("kill $pid");
    }
    ?>

    Il log di apache2 mi dice "undefined variable : pid" quando premo il secondo tasto

    Per caso la variabile scompare dopo il primo utilizzo di if(ISSET ???
    non so di che tasti tu stia parlando. ma fondamentalmente accade questo:

    - avvii il tuo script php che esegue il tuo nomescript.sh
    - l'esecuzione dello script continua

    quando richiami lo script per la seconda volta, premendo un tasto(?), esegui lo stesso script che non ha alcun riferimento rispetto al precedente. Normale quindi che non abbia quella variabile valorizzata.

    Aggiungo inoltre come da manuale php

    exec() esegue il comando passato da command, la funzione non invia nessun output. Restituisce semplicemente l'ultima linea dal risultato del comando. Se si ha bisogno di eseguire un comando ed avere tutti i dati passati direttamente indietro senza alcuna interferenza, usare la funzione passthru().
    quindi exec ti serve per eseguire programmi non per recuperare il pid dell'operazione. L'unico caso in cui questo potrebbe avvenire è che tu, dallo script che esegui, stampi a video, e solo quello, appunto il pid.

    Ciò non toglie che, lo script lanciato la prima volta termina e di conseguenza per usare il pid devi necessariamente passarlo in un altro modo(Sessioni o in GET)
    Ultima modifica di ciro78; 26-11-2013 a 18:56
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    36
    Per tasti intendo due normalissimi "button" html nella stessa pagina
    In pratica mi servirebbe che un tasto mi facesse eseguire il mio nomescript.sh e l'altro me lo killasse oppure se fosse possibile , ma non necessario, che la seconda pressione del tasto che ha avviato lo script me lo fermasse.

    Ho fatto una cosa molto empirica del tipo :

    <?php
    if (isset($_POST['TastoA']))
    {
    $pid = exec("nohup nomescript.sh > /dev/null 2>&1 & echo $!");
    exec("pid.sh $pid");
    }

    if (isset($_POST['TastoB']))
    {
    exec('kill.sh');
    }
    ?>

    Cliccando il tasto A viene lanciato nomescript.sh, dopodiche viene lanciato lo script pid.sh con la variabile $pid (script che mi scrive su un file il pid del primo processo)
    Cliccando sul tasto B viene eseguito kill.sh che mi prende il numero pid dal file e me lo killa

    E' molto spartano, tipo compitino da elementari, ci saranno metodi molto migliori ma non li conosco
    Comunque funziona ma mi rendo conto che e' una porcheria......

    Tra l'altro se clicco piu' volte sul primo tasto , mi vengono lanciati piu' processi nomescript.sh e la frittata e' fatta......

  6. #6
    prima di lanciare il processo controlla che non sia già in esecuzione

    per il resto piu o meno hai fatto. E' una porcata? Beh l'idea di fare start e stop così non è il massimo, ma neanche il minimo. Puoi prevedere una cosa del tipo:

    Codice PHP:

    $status 
    shell_exec("nomescript.sh --status");

    if(
    $status "RUNNING"){
    shell_exec("nomescript.sh --stop");
    }elseif(
    $status "STOPPED"){
    shell_exec("nomescript.sh --start");

    e deleghi a nomescript.sh la gestione del PID (che in bash si fà in modi specifici, cerca un pò di materiale su google) . Normalmente puoi fare:

    codice:
    touch /var/run/nomescript.pid
    . Quando fai uno status controlli che quel pid file esiste ed esiste il processo usando ps aux. Se esistono entrambi, puoi ritornare RUNNING, altrimenti STOPPED. Quando stoppi il servizio puoi fare nell'sh il kill del processo e RIMUOVERE /var/run/nomescript.pid

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    come mi hanno fatto notare in privato, negli IF l'uguale deve essere doppio $status == quindi, non $status = ... vabbeh, la fretta di scrivere....

    ok mi avete scoperto non so un caxxo di PHP faccio finta altrimenti mi licenziano
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    36
    Grazie delle info Santino

    Alla fine ho optato per uno scriptino che mi restituisce il pid del processo interessato e si comporta di conseguenza :

    if ps -C nomescript.sh -o pid= > /dev/null 2>&1
    then
    exit
    else
    /nomescript.sh
    fi

    (per non eseguire nomescript.sh se e' gia' in esecuzione)

    dentro nomescript.sh c'e' :

    pid=$(ps -C nomescript.sh -o pid=)
    echo $pid > /home/mydir/pidnumber

    il file pidnumber lo utilizzo in un altro script per killare nomescript.sh in questo modo

    kill $(< /home/mydir/pidnumber)


    ma qui siamo in shell non molto di php.......

    comuque sembra funzionare




    una domanda OT:

    invece di scrivere

    pid=$(ps -C nomescript.sh -o pid=)
    echo $pid > /home/mydir/pidnumber

    si puo' scrivere

    $(ps -C nomescript.sh -o pid=) > /home/mydir/pidnumber

    o qualcosa del genere ??? (le sintassi mi uccidono sempre..)

    Grazie mille

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.