2015-10-12 4 views
5

Я создал gulpfile.js, чтобы запустить мои серверы, и его содержимое можно увидеть ниже.Как убить все серверы, работающие в режиме gulp, используя одну команду 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')); 

Проблема заключается в том, если меньше препроцессора аварий по какой-либо причине, то gulpfile.js демон выходит плохо. Детские процессы python manage.py runserverpython -m SimpleHTTPServeraptly api serve все еще работает.

Мне пришлось тщательно их прекратить, используя ps -aux | grep runserver и аналогично найти PID для удаления через sudo kill -9 $PID.

Есть ли способ убить все процессы, если мой gulpfile.js неожиданно завершился с ошибкой?

+0

Вы можете обнаружить, что 'pkill -f runserver' делает последнюю часть более гладкой. –

+0

Да, я знаю, но снова, я должен запустить три команды pkill. Я хочу объединить эти команды в один. – python

+0

Я планирую написать сценарий bash, чтобы убить все серверы. Вы думаете, что это хорошая идея? или есть некоторые лучшие методы – python

ответ

1

Использование функции recurive для передачи сигнала kill всем дочерним процессам. Создайте следующий файл ./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 

}

Источник файл в Баш с

source ./killChilds.sh 

Вы можете что использовать его, чтобы убить все дерево процесса в консоли с

killChilds $pid 

Где $ pid - основной процесс. Возможно, вы захотите включить файл в ~/.bashrc, чтобы вам не приходилось его выставлять каждый раз.

 Смежные вопросы

  • Нет связанных вопросов^_^