设为首页 收藏本站
查看: 878|回复: 0

[经验分享] 一起读nodejs(五)----进程(process)

[复制链接]

尚未签到

发表于 2017-2-22 07:29:56 | 显示全部楼层 |阅读模式
    本文是对nodejs0.8.9版本的api开发手册解读.nodejs网址
    进程(process)
    process对象是一个全局对象,它可以在任何地方被访问.它是一个EventEmitter对象的实例.
   Event:'exit'
    当一个进程即将退出时放出'exit'事件,这一个用来定时检查模块的状态的好钩子(hook)(例如单元测试),当主事件循环在执行完'exit'的回调函数后将不再执行,所以在exit事件中定义的定时器可能不会被加入事件列表.
    监听'exit'事件的例子:

process.on('exit', function () {
process.nextTick(function () {
console.log('This will not run');
});
console.log('About to exit.');
});
  
    Event:'uncaughtException'
    当一个异常冒泡循环一圈又回到node事件循环时放出'uncaughtException'.如果这个异常被添加了一个监听器,默认操作(打印堆栈信息并退出)将不会执行.
    监听'uncaughtException'事件的例子:

process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
});
setTimeout(function () {
console.log('This will still run.');
}, 500);
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
  
  注意:uncaughtException是一个很低级的异常处理,在将来可能被移除.
    不要使用它,用domains代替(后面会讲),如果你非用不可,只好每次在程序发生异常之后重启.
    不要把它和'On Error Resume Next'一起用,因为一个未处理的异常意味着你的程序--甚至是node.js自己--在一个未定义的状态.盲目的恢复继续执行疑问这任何事都可能发生.
    想像一下,在你正在升级你的系统的时候拉扯主机电源线,十有八九可能什么都不会发生--但是第十次,你的系统会瘫痪.
    你已经被警告过了.
  

   信号事件(signal Events)
    当进程接受到一个信号时发出'singal'事件.可以使用sigaction(2)(linux系统下)查看标准的posix 信号命名列表,例如:SIGINT,SIGUSR1,等等.
    监听'signal'事件的例子:

// Start reading from stdin so we don't exit.
process.stdin.resume();
process.on('SIGINT', function () {
console.log('Got SIGINT.  Press Control-D to exit.');
});
  
  一个简单的方式发送SIGINT信号的方法是:control-c,在大多是终端程序里.
  
    process.stdout
    一个可以写道stdout的流
    例子:console.log的定义:

console.log = function (d) {
process.stdout.write(d + '\n');
};
    process.stderr和process.stdout在node中是和其他流不一样在往这些流里写东西时是阻塞的.这些阻塞的流需要索引常规文件或者tty文件描述.而process.stderr和process.stdout是索引管道,他们不像其他流一样阻塞.
  
    process.stdin
    标准输入流是一个可读的流,stdin流默认是暂停状态,所以想要从stdin读取必须要调用一次process.stdin.resume();
    打开stdin和监听两个事件的例子:

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (chunk) {
process.stdout.write('data: ' + chunk);
});
process.stdin.on('end', function () {
process.stdout.write('end');
});
  


   process.argv
    一个包含命令行参数的数组.第一个元素将会是"node",第二个参数将会是一个javascript文件的名字,后面的元素将会是一些附加的命令行参数.

// print process.argv
process.argv.forEach(function (val, index, array) {
console.log(index + ': ' + val);
});
  
这将会产生:

$ node process-2.js one two=three four
0: node
1: /Users/mjr/work/node/process-2.js
2: one
3: two=three
4: four
  
   process.execPath
    这是启动进程的可执行程序的绝对路径.
    例子:

/usr/local/bin/node
  
   process.abort()
    这将引起node发出一个abort事件,将会引起node退出并生成一个核心文件.
  
   process.chdir(directory)
    改变当前进程的工作目录,如果失败会放出一个异常.

console.log('Starting directory: ' + process.cwd());
try {
process.chdir('/tmp');
console.log('New directory: ' + process.cwd());
}
catch (err) {
console.log('chdir: ' + err);
}
  
   process.cwd()
    返回当前进程的工作目录.

console.log('Current directory: ' + process.cwd());
  
    process.env
    一个包含了用户的环境变量的对象,可以用eviron(7)查看详细(Linux下)
  
    process.exit([code])
    用指定的code结束进程,如果省略了code,就会使用'success'code 0.
    用'failure'代码退出:

process.exit(1);
  
  在shell下可以看见node的退出代码1(我在window下没看见).
  
    process.getgid()
    注意:这个函数支持posix平台,不支持windows平台.
    获得进程的组id,(getgid(2)查看详细),这是一个数组组id,不是组名称.

if (process.getgid) {
console.log('Current gid: ' + process.getgid());
}
  
   process.setgid()
    注意:这个函数支持posix平台,不支持windows平台.
    设置进程的组id,可以接受一个数字id或者一个组名称字符串.如果一个组名称被指定,这个方法在通过给定的组名称解析出数字id之前是阻塞的.

if (process.getgid && process.setgid) {
console.log('Current gid: ' + process.getgid());
try {
process.setgid(501);
console.log('New gid: ' + process.getgid());
}
catch (err) {
console.log('Failed to set gid: ' + err);
}
}
  

    process.getuid()
   注意:这个函数支持posix平台,不支持windows平台.
    获得线程的用户id,这是一个数字id,不是一个用户名.

if (process.getuid) {
console.log('Current uid: ' + process.getuid());
}
  

   process.setuid()
   注意:这个函数支持posix平台,不支持windows平台.
    设置线程的用户id,可以接受一个数字id或者一个组名称字符串.如果一个组名称被指定,这个方法在通过给定的组名称解析出数字id之前是阻塞的.

if (process.getuid && process.setuid) {
console.log('Current uid: ' + process.getuid());
try {
process.setuid(501);
console.log('New uid: ' + process.getuid());
}
catch (err) {
console.log('Failed to set uid: ' + err);
}
}
  

    process.version
    一个内编译的属性,把NODE_VERSION属性暴漏了出来.

console.log('Version: ' + process.version);
  

  
process.versions
    这个属性曝露出了node和node的依赖库的版本.

console.log(process.versions);
  
  将会输出:

{ node: '0.4.12',
v8: '3.1.8.26',
ares: '1.7.4',
ev: '4.4',
openssl: '1.0.0e-fips' }
   process.config
    这个对象代表了我们用来编译当前node的可执行程序的配置信息的javascript描述.这和我们运行./configure时生成的'config.gypi'一样.
    一个输出的例子大概是:

{ target_defaults:
{ cflags: [],
default_configuration: 'Release',
defines: [],
include_dirs: [],
libraries: [] },
variables:
{ host_arch: 'x64',
node_install_npm: 'true',
node_install_waf: 'true',
node_prefix: '',
node_shared_v8: 'false',
node_shared_zlib: 'false',
node_use_dtrace: 'false',
node_use_openssl: 'true',
node_shared_openssl: 'false',
strict_aliasing: 'true',
target_arch: 'x64',
v8_use_snapshot: 'true' } }
  

    process.kill(pid,[signal])
    发送一个信号到进程.pid是进程id,参数signal是要发送信号的一个字符串描述.信号的命名看起来像:'SIGINT'or'SIGINT1'.如果省略signal参数,将默认是:'SIGTERM',可以用kill(2)查看更多信息.
    注意,正因为名字是process.kill,它确实只是一个信号发送器.就像系统调用call一样.发送的信号,可能除了杀死进程外还要做其他一些事情.
    给自己发送一个进程的例子:

process.on('SIGHUP', function () {
console.log('Got SIGHUP signal.');
});
setTimeout(function () {
console.log('Exiting.');
process.exit(0);
}, 100);
process.kill(process.pid, 'SIGHUP');
  

    process.pid
    进程的pid属性.

console.log('This process is pid ' + process.pid);
  
   process.title
    设置或者获取在使用ps命令时显示的名称.
  
   process.arch
    你正在使用的处理器类型,例如:'arm','ia32'or'x64'.

console.log('This processor architecture is ' + process.arch);
  

   process.platform
    你正在使用的平台,例如:'darwin','freebsd','linux','solaris'or'win32'.

console.log('This platform is ' + process.platform);
  

   process.memoryUsage()
    返回一个node通过bytes测试的内存用法的表述的对象.

var util = require('util');
console.log(util.inspect(process.memoryUsage()));
  
例如:

{ rss: 4935680,
heapTotal: 1826816,
heapUsed: 650472 }
   process.nextTick(callback)
    在事件循环的下次循环中执行callback.这不是一个简单的setTimeout(fn,0)的别名.它的效率要高很多.

process.nextTick(function () {
console.log('nextTick callback');
});
  

   process.umask([mask])
    设置或者读取线程的文件模式创建掩码(屏蔽字).子进程从父进程继承掩码.如果是设置操作,将返回原先的mask,如果是读取,返回当前的mask.

var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
' to ' + newmask.toString(8));
  

   process.uptime()
    返回一个数字,代表当前node已经运行的时间.
  
   process.hrtime()
    返回一个[秒,纳秒]形式的数组,代表了当前实时最高分标率.返回结果和过去的时间有关,和天数没有关系,因此没有对象记录偏移量.最初用于测量interval之间的效果.
    你可以传入上次process.hrtime()返回的结果到process.hertime()中,得到一个不一样的结果.用来测量基准点和interval很有用.

var t = process.hrtime();
// [ 1800216, 927643717 ]
setTimeout(function () {
t = process.hrtime(t);
// [ 1, 6962306 ]
console.log('benchmark took %d seconds and %d nanoseconds', t[0], t[1]);
// benchmark took 1 seconds and 6962306 nanoseconds
}, 1000);
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345382-1-1.html 上篇帖子: <了不起的NODEJS>学习笔记 下篇帖子: 一起读nodejs(八)----域(domain)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表