求助:关于child_process中的exec
发布于 10 年前 作者 jcpwfloi 4978 次浏览 最后一次编辑是 8 年前 来自 问答

我们不妨设现在有一个需要运行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) {
	});

仍然和上述情况相同。。不知道为啥,跪求解答。

3 回复

exec只是个传话器,并不负责实际的内容运行。

nodejs调用exec告诉OS: 需要运行OS的哪条指令。然后OS开动一个进程去干活,干完活把结果发回nodejs。 nodejs本身也属于OS其中的一条进程。

个人猜测:exec 会启动一个 shell, 当 kill 的时候实际上是在 kill 这个 shell, 所以 shell 启动的子进程不会被正确地结束。 因此建议使用 spawn 代替 exec.

我试了试,发现情况是这样的, node.jpg 当执行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系统编程的,具体我也不懂。

回到顶部