Premendo Ctrl-C arresta lo script bash, ma non interrompe lo script PHP chiamato dallo script

Ho bisogno di eseguire alcuni script each pochi minuti. La logica è stata fatta in PHP e sta funzionando bene. Per mantenere le cose insieme ho fatto uno script bash, che va bene.

#!/bin/bash calculaDiff() { DIFF=0 while [ "$DIFF" -eq "0" ]; do DIFF=`php calculaDiff.php` done; } # need to calculate pending diffs calculaDiff # main loop while true; do CAPTURA=`php capturaRelatorio.php` if [ "$CAPTURA" -eq "0" ]; then calculaDiff fi VERIFICA=`php verificaLimites.php` done 

Lo script capturaRelatorio.php ha un sonno dentro di esso perché posso elaborarlo solo each N minuti. Verrà printingto un messaggio che dice che sta dormendo per S secondi in modo da poterlo monitorare.

  • Qual è il numero massimo di file che un file system può contenere?
  • Cattura pacchetti: filtraggio su RX vs TX
  • Il server è sovraccaricato, agisce come fuori memory, ma non è vero
  • Windows 7 o Server 2008 Visualizza il tempo di esecuzione di un process
  • Utility per submit un command a più terminali?
  • Distributo, Parallelo, File System tollerante ai guasti
  • Se chiamo lo script bash e premere Ctrl + C in questo momento, mentre dorme, uccide lo script bash, ma non uccide lo script php chiamato. Capisco che esiste un process diverso.

    Quindi, c'è un modo per uccidere lo script bash e each "bambino"? O devo andare con un altro approccio per eseguire questi script?

    2 Solutions collect form web for “Premendo Ctrl-C arresta lo script bash, ma non interrompe lo script PHP chiamato dallo script”

    Da questa risposta: bash – Come uccidere tutti i sottoprocessi di shell? – Overflow dello stack .

    Se ti interessa solo l'uccisione di bambini diretti, dovresti essere in grado di fare

     pkill -P $$ 

    -P dice -P

     -P, --parent ppid,... Only match processes whose parent process ID is listed. 

    E $$ significa il PID del process corrente.

    Se wherete uccidere i processi infantili e tutti i processi che possono iniziare (nipoti e così via), dovresti essere in grado di utilizzare la function in una risposta diversa a quella domanda:

     kill_descendant_processes() { local pid="$1" local and_self="${2:-false}" if children="$(pgrep -P "$pid")"; then for child in $children; do kill_descendant_processes "$child" true done fi if [[ "$and_self" == true ]]; then kill "$pid" fi } 

    Come questo

     kill_descendant_processes $$ true 

    Che ucciderà il process attuale e tutti i discendenti. Probabilmente lo volete call da un gestore di trappole. Cioè quando si preme ctrl + c , lo script verrà inviato SIGINT e si può prendere quel segnale e gestirlo. Per esempio:

     trap cleanup INT cleanup() { kill_descendant_processes $$ true } 

    È ansible aggiornare lo script bash per intrappolare ctrl + c:

     trap control_c SIGINT function control_c() { echo "## Trapped CTRL-C" ps -ef | grep php | grep -v grep | awk '{ print $2 }' > php.kill for i in $(cat php.kill) do kill -9 $i > /dev/null done rm php.kill } 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.