Django 如何使用一个bash命令杀死所有在gulp中运行的服务器

Django 如何使用一个bash命令杀死所有在gulp中运行的服务器,django,bash,gulp,kill-process,gulp-watch,Django,Bash,Gulp,Kill Process,Gulp Watch,我已经创建了一个gulpfile.js来启动我的服务器,其内容如下所示 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'); aptl

我已经创建了一个
gulpfile.js
来启动我的服务器,其内容如下所示

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 runserver
python-m SimpleHTTPServer
将仍然运行

我不得不通过使用
ps-aux | grep runserver
和类似的工具,通过
sudo kill-9$PID
找到要删除的PID,煞费苦心地终止这些


如果我的gulpfile.js意外崩溃,有没有办法直接杀死所有进程

使用Recrive函数向所有子进程发送终止信号。 创建以下./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
}

在bash中使用

source ./killChilds.sh
您可以使用它杀死控制台中的整个进程树

killChilds $pid
其中$pid是主进程。
您可能希望将文件包含到~/.bashrc中,这样您就不必每次都对其进行源代码分析。

您可能会发现
pkill-f runserver
至少使最后一部分更平滑。是的,我知道,但我必须再次启动三个pkill命令。我希望将这些命令组合成一个命令。我计划只编写一个bash脚本来杀死所有服务器。你认为这是个好主意吗?或者有一些更好的方法如果要终止的进程的名称是预先知道的,那么就称它们为p1,p2,p3,为什么不呢:对于p1中的f;do pkill$f;完成,可能需要使用其他一些pkill选项。如果您的进程通过专用用户运行,
pkill-u YourUser
这些进程的状态如何?僵尸与否?父PID是否保持可见?在这种情况下,
pkill-P-f runserver