2015-10-12 10 views
5

Ich habe eine gulpfile.js zum Starten meiner Server erstellt, und der Inhalt kann unten gesehen werden.Wie alle Server im Schluck mit einem Bash-Befehl zu töten

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')); 

Das Problem ist, wenn weniger Präprozessor aus irgendeinem Grund abstürzt, der gulpfile.js Daemon schlecht beendet. Die untergeordneten Prozesse python manage.py runserverpython -m SimpleHTTPServer werden weiterhin ausgeführt.

Ich musste diese mühsam beenden, indem Sie eine ps -aux | grep runserver und ähnliche PID zum Löschen über sudo kill -9 $PID finden.

Gibt es eine Möglichkeit, alle Prozesse direkt zu beenden, wenn meine gulpfile.js unerwartet abstürzt?

+0

Sie können feststellen, dass 'pkill -f runserver' den letzten Teil zumindest glatter macht. –

+0

Ja ich weiß aber nochmal, ich muss drei pkill Befehle abfeuern. Ich versuche, diese Befehle zu einem zu kombinieren. – python

+0

Ich plane, einfach ein Bash-Skript zu schreiben, um alle Server zu töten. Halten Sie es für eine gute Idee? oder gibt es einige bessere Methoden da draußen – python

Antwort

1

Verwenden einer Wiederholungsfunktion, um das Kill-Signal an alle untergeordneten Prozesse zu senden. Erstellen Sie die folgende ./killChilds.sh Datei

#!/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 

}

Quelle mit der Datei in Ihrem bash

source ./killChilds.sh 

Sie, dass es verwenden, um den gesamten Prozess Baum in der Konsole zu töten mit

Wo $ pid ist der Hauptprozess. Sie könnten die Datei in ~/.bashrc einschließen, damit Sie sie nicht jedes Mal neu beziehen müssen.