2015-10-12 48 views
5

Ho creato un gulpfile.js per avviare i miei server, e il suo contenuto può essere visto sotto.Come uccidere tutti i server in esecuzione in gulp utilizzando un comando bash

gulp.task('default', function() { 
    if(!fs.statSync('/etc/aptly.conf').isFile()){ 
    process.exit(); 
    return; 
    } 

    console.info('Starting static file server SimpleHTTPServer on 0.0.0.0:8080'); 
    aptly_static = spawn('python', ['-m', 'SimpleHTTPServer', '8080'], {'cwd': '/opt/aptly/public', 'stdio': 'inherit'}); 

    console.info('Starting Django runserver on 0.0.0.0:8000'); 
    django = spawn('python', ['manage.py', 'runserver', '0.0.0.0:8000'], {'stdio': 'inherit'}); 

    console.info('Starting Aptly api serve on 0.0.0.0:4416'); 
    aptly_api = run('aptly api serve -listen="0.0.0.0:4416"').exec().pipe(gulp.dest('/tmp/aptlylog')); 

    return watchLess('src/**/*.less') 
    .pipe(debug()) 
     .pipe(reLess) 
     .pipe(gulp.dest('dist/dist')); 

Il problema è se meno crash preprocessore per qualsiasi motivo, il gulpfile.js daemon esce male. I processi figlio python manage.py runserverpython -m SimpleHTTPServeraptly api serve saranno ancora in esecuzione.

Ho dovuto fermamente risolvere questi utilizzando uno ps -aux | grep runserver e simili per trovare il PID da eliminare tramite sudo kill -9 $PID.

C'è un modo per uccidere tutti i processi direttamente se il mio gulpfile.js si arresta in modo imprevisto?

+0

Potreste trovare 'pkill -f runserver' che rende l'ultima parte più agevole, almeno. –

+0

Sì, lo so, ma ancora una volta, devo sparare tre comandi pkill. Sto cercando di combinare questi comandi in uno solo. – python

+0

Sto pianificando di scrivere solo uno script bash per uccidere tutti i server. Pensi che sia una buona idea? o ci sono alcuni metodi migliori là fuori – python

risposta

1

Utilizzo di una funzione ricorsiva per inviare il segnale di eliminazione a tutti i processi figlio. Creare il seguente file ./killChilds.sh

#!/usr/bin/env bash 

function KillChilds { 
    local pid="${1}" # Parent pid to kill childs 
    local self="${2:-false}" # Should parent be killed too ? 

    if children="$(pgrep -P "$pid")"; then 
     for child in $children; do 
      KillChilds "$child" true 
     done 
    fi 

    # Try to kill nicely, if not, wait 15 seconds to let Trap actions happen before killing 
    if ([ "$self" == true ] && kill -0 $pid > /dev/null 2>&1); then 
     kill -s TERM "$pid" 
     if [ $? != 0 ]; then 
      sleep 15 
      kill -9 "$pid" 
      if [ $? != 0 ]; then 
       return 1 
      fi 
     else 
      return 0 
     fi 
    else 
     return 0 
    fi 

}

Fonte il file nella bash con

source ./killChilds.sh 

che è possibile utilizzare per uccidere l'intero albero processo in console con

killChilds $pid 

Dove $ pid è il processo principale. Si potrebbe voler includere il file in ~/.bashrc in modo da non doverlo cercare ogni volta.