我们不妨设现在有一个需要运行2.3s左右的程序。它在同目录下。./1可以执行它, 我们给它重定向输入输出,但是这个程序有时间限制,一旦超过时间限制我们需要立马终结它。
var cp = require('child_process');
var child = cp.exec(__dirname + '/1 < in > tempout', function(err, stdout, stderr) {
clearTimeout(timer);
});
var timer = setTimeout(function() {
child.kill();
}, 1000);
然后我尝试了这样一个代码,发现无论如何程序还是会在2.3s后正常输出到tempout。
var cp = require('child_process');
cp.exec(__dirname + '/1 < in > tempout', {timeout: 1000, killSignal: 'SIGTERM'}, function(err, stdout, stderr) {
});
仍然和上述情况相同。。不知道为啥,跪求解答。
exec只是个传话器,并不负责实际的内容运行。
nodejs调用exec告诉OS: 需要运行OS的哪条指令。然后OS开动一个进程去干活,干完活把结果发回nodejs。 nodejs本身也属于OS其中的一条进程。
个人猜测:exec 会启动一个 shell, 当 kill 的时候实际上是在 kill 这个 shell, 所以 shell 启动的子进程不会被正确地结束。 因此建议使用 spawn 代替 exec.
我试了试,发现情况是这样的, 当执行exec的时候,node的子进程是bash,bash的子进程是test.sh>log,本来我以为到这里就结束了,然而test.sh>log还有另外一个子进程test.sh。当timeout的时候。nodekill掉了bash,因为test.sh>log是bash的子进程,因此它也被kill掉了。但是test.sh>log的子进程test.sh却没有跟着被kill,它的父进程变成了1。这可能就是导致脚本继续执行下去的原因了,至于为何会这样,需要看node源码和linux系统编程的,具体我也不懂。