Timers 计时器

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’

  1. 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:

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

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

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

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

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

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

  1. var sys = require('sys'),
  2. spawn = require('child_process').spawn,
  3. ls = spawn('ls', ['-lh', '/usr']);
  4. ls.stdout.on('data', function (data) {
  5. sys.print('stdout: ' + data);
  6. });
  7. ls.stderr.on('data', function (data) {
  8. sys.print('stderr: ' + data);
  9. });
  10. ls.on('exit', function (code) {
  11. console.log('child process exited with code ' + code);
  12. });

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

  1. var sys = require('sys'),
  2. spawn = require('child_process').spawn,
  3. ps = spawn('ps', ['ax']),
  4. grep = spawn('grep', ['ssh']);
  5. ps.stdout.on('data', function (data) {
  6. grep.stdin.write(data);
  7. });
  8. ps.stderr.on('data', function (data) {
  9. sys.print('ps stderr: ' + data);
  10. });
  11. ps.on('exit', function (code) {
  12. if (code !== 0) {
  13. console.log('ps process exited with code ' + code);
  14. }
  15. grep.stdin.end();
  16. });
  17. grep.stdout.on('data', function (data) {
  18. sys.print(data);
  19. });
  20. grep.stderr.on('data', function (data) {
  21. sys.print('grep stderr: ' + data);
  22. });
  23. grep.on('exit', function (code) {
  24. if (code !== 0) {
  25. console.log('grep process exited with code ' + code);
  26. }
  27. });

例子,检测退出代码:

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

请参见:child_process.exec()

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

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

  1. var sys = require('sys'),
  2. exec = require('child_process').exec,
  3. child;
  4. child = exec('cat *.js bad_file | wc -l',
  5. function (error, stdout, stderr) {
  6. sys.print('stdout: ' + stdout);
  7. sys.print('stderr: ' + stderr);
  8. if (error !== null) {
  9. console.log('exec error: ' + error);
  10. }
  11. });

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

  1. { encoding: 'utf8'
  2. , timeout: 0
  3. , maxBuffer: 200*1024
  4. , killSignal: 'SIGKILL'
  5. , cwd: null
  6. , env: null
  7. }

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

child.kill(signal=’SIGTERM’)

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

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

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