阅读(2357) (0)

Timers 计时器

2017-07-11 09:29:34 更新

setTimeout(callback, delay, [arg], [...])

设置延时delay 毫秒之后执行回调函数(callback)。该函数返回timeoutId,可以使用clearTimeout()清除定时。你 也可以传递额外的参数给回调函数。

clearTimeout(timeoutId)

清除指定的定时。

setInterval(callback, delay, [arg], [...])

设置重复延时调用callback。该函数返回intervalId,可以使用clearTimeout()清除定时。你也可以传递可选的 参数给回调函数。

.end(); clearInterval(intervalId)

清除指定的重复延时回调。

Child Processes 子进程

node 通过ChildProcess 类提供全面的popen(3)功能。 程序可以通过子进程的标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)以完全非阻塞的形式传递数据。

你可以使用require('child_process').spawn()创建子进程。 每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。 每个ChildProcess 类也是一个事件触发器。

Event: 'exit'

function (code, signal) {}

此事件在子进程结束后被触发。如果进程正常结束,code 参数的值就是子进程退出后的返回值,否则此参数为 null。如果进程因为信号而终止,参数signal 就是信号的名称,否则此参数为null。 触发此事件之后,node 将不再触发'output'和'error'事件。 See waitpid(2).

child.stdin

可写流(Writable Stream),代表子进程的标准输入(stdin)。使用end()函数关闭此流(stream),通常会终止子进程。

child.stdout

只读流(Readable Stream),代表子进程的标准输出(stdout)。 child.stderr

只读流(Readable Stream),代表子进程的标准错误输出(stderr)。

child.pid

子进程的PID Example:

var spawn = require('child_process').spawn,
grep = spawn('grep', ['ssh']);
console.log('Spawned child pid: ' + grep.pid);
grep.stdin.end();

child_process.spawn(command, args=[], [options])

使用指定的命令行参数创建新线程。如果不指定参数,args 默认为空数组。 第三个参数用于指定一些额外的选项,默认值如下:

{ cwd: undefined
, env: process.env,
, customFds: [-1, -1, -1]
}

cwd 可以用于指定新进程的工作目录,env 指定新进程可见的环境变量,而customFds 则可以将新进程的 [stdin,stdout,stderr]绑定到指定的流,-1指创建新的流。

例子:执行命令'ls -lh /usr'并捕获标准输出、标准错误输出和退出代码(程序退出时,main 函数返回的代码)。

var sys = require('sys'),
spawn = require('child_process').spawn,
ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function (data) {
sys.print('stdout: ' + data);
});
ls.stderr.on('data', function (data) {
sys.print('stderr: ' + data);
});
ls.on('exit', function (code) {
console.log('child process exited with code ' + code);
});

例子: 实现'ps ax | grep ssh'命令。

var sys = require('sys'),
spawn = require('child_process').spawn,
ps = spawn('ps', ['ax']),
grep = spawn('grep', ['ssh']);
ps.stdout.on('data', function (data) {
grep.stdin.write(data);
});
ps.stderr.on('data', function (data) {
sys.print('ps stderr: ' + data);
});
ps.on('exit', function (code) {
if (code !== 0) {
console.log('ps process exited with code ' + code);
}
grep.stdin.end();
});
grep.stdout.on('data', function (data) {
sys.print(data);
});
grep.stderr.on('data', function (data) {
sys.print('grep stderr: ' + data);
});
grep.on('exit', function (code) {
if (code !== 0) {
console.log('grep process exited with code ' + code);
}
});

例子,检测退出代码:

var spawn = require('child_process').spawn,
child = spawn('bad_command');
child.stderr.on('data', function (data) {
if (/^execvp\(\)/.test(data.asciiSlice(0,data.length))) {
console.log('Failed to start child process.');
}
});

请参见:child_process.exec()

child_process.exec(command, [options], callback)

使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。

var sys = require('sys'),
exec = require('child_process').exec,
child;
child = exec('cat *.js bad_file | wc -l',
function (error, stdout, stderr) {
sys.print('stdout: ' + stdout);
sys.print('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});

回调函数得到的参数分别为(error, stdout, stderr)。成功时error 参数是null;失败时error 参数是Error 的实例。 error.code 是子进程的返回值,error.signal 保存终止进程的信号。 exec 函数的第二个可选参数可以用来指定一些选项。默认值为

{ encoding: 'utf8'
, timeout: 0
, maxBuffer: 200*1024
, killSignal: 'SIGKILL'
, cwd: null
, env: null
}

如果timeout 为大于0的值,node 将终止运行时间超过timeout(单位为毫秒)的子进程。子进程将被终止信号 (killSignal,默认值为'SIGKILL')终止。maxBuffer 指定stdout 和stderr 最大可缓存数据的大小,如果超过这个值 子进程将被终止。

child.kill(signal='SIGTERM')

向子进程发送信号。如果不指定参数,默认发送'SIGTERM'信号。所有可用信号列表请参考signal(7)。

var spawn = require('child_process').spawn,
grep = spawn('grep', ['ssh']);
grep.on('exit', function (code, signal) {
console.log('child process terminated due to receipt of signal '+signal);
});
// send SIGHUP to process
grep.kill('SIGHUP');

注意,虽然此函数名为kill,但发送的信号不一定终止子进程。kill 实际上只会向进程发送信号。 See kill(2) 更多信息请参考kill(2)