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

How to kill all servers running in gulp using one bash command

我创建了一个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'));

问题是如果 less 预处理器因任何原因崩溃,gulpfile.js 守护程序将无法正常退出。子进程 python manage.py runserver python -m SimpleHTTPServer aptly api serve 仍将是 运行。

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

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

使用递归函数向所有子进程发送终止信号。 创建以下 ./killChilds.sh 文件

#!/usr/bin/env bash

function KillChilds {
    local pid="" # 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 中,这样您就不必每次都获取它。