如何杀死构建后从jenkins中生成的子进程?

时间:2013-05-02 22:14:05

标签: node.js ant jenkins cmd

当我使用Jenkins构建我的项目时,我需要启动一个nodejs服务器进程来托管一些文件,如果我要像下面这样开始这个过程,那么构建会无限地挂起

<target name="staticserver" description="Starts nodejs static server">
    <exec executable="node">
        <arg value="${env.WORKSPACE}staticserver.js"/>
    </exec>
</target>

所以我切换到以下版本,构建运行正常

<target name="staticserver" description="Starts nodejs static server">
    <exec executable="cmd.exe">
        <arg value="/c"/>
        <arg value="start"/>
        <arg value="node"/>
        <arg value="${env.WORKSPACE}staticserver.js"/>
    </exec>
</target>

然而,当Jenkins构建完成时,节点进程仍处于活动状态。

我四处寻找,但似乎每个人杀死子进程的问题都是Jenkins杀死所有人......

我应该如何启动节点进程,以便Jenkins可以在构建完成后正确杀死它? 我是从错误的角度接近这个问题,需要从不同的方向看待它吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的两种方法,第一种是添加杀死所有node.exe的目标,如果不需要在同一台机器上运行其他节点实例,则不会出现问题

<target name="stopnode" description="Stops all instances of node">
    <exec executable="taskkill">
        <arg value="/IM"/>
        <arg value="node.exe"/>
    </exec>
</target>

第二种方法是添加一个在访问服务器时重置的计时器,并在服务器暂时无法访问时关闭服务器。

global.timer = {
    count: 5,
    reset: function() {
        this.count = 5;
    }
};

function countdown() {
    global.timer.count = global.timer.count - 1;
    //console.log(global.timer.count);
    if (global.timer.count <= 0) {
        clearInterval(cd);
        process.exit(0);
    }
}

var cd = setInterval(function () { countdown() }, 1000);

jsfiddle只是为了好玩:http://jsfiddle.net/jeJkm/