nodejs exit的process进程在什么情况下exit

nodejs入门--process 进程 - CSDN博客
nodejs入门--process 进程
转载:http://lnmp.in/node-process
process对象是一个全局对象,可以在任何地方访问它。它是EventEmitter事件触发器类型的一个实例。
Event: 'exit' 事件:'exit'
function () {}
当进程对象要退出时会触发此方法,这是检查模块状态(比如单元测试)的好时机。当'exit'被调用完成后主事件循环将终止,所以计时器将不会按计划执行。
监听exit行为的示例:
process.on('exit', function () {
process.nextTick(function () {
console.log('This will not run');
console.log('About to exit.');
Event: 'uncaughtException' 事件:'uncaughtException'
function (err) { }
当一个异常信息一路冒出到事件循环时,该方法被触发。如果该异常有一个监听器,那么默认的行为(即打印一个堆栈轨迹并退出)将不会发生。
监听uncaughtException事件的示例:
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' + err);
setTimeout(function () {
console.log('This will still run.');
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
注意:就异常处理来说,uncaughtException是一个很粗糙的机制。在程序中使用try/catch可以更好好控制程序流程。而在服务器编程中,因为要持续运行,uncaughtException还是一个很有用的安全机制。
Signal Events 信号事件
function () {}
该事件会在进程接收到一个信号时被触发。可参见sigaction(2)中的标准POSIX信号名称列表,比如SIGINT,SIGUSR1等等。
监听&SIGINT的示例:
// 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的Writable Stream可写流。
示例:console.log的定义。
console.log = function (d) {
process.stdout.write(d + '\n');
process.stderr
一个指向错误的可写流,在这个流上的写操作是阻塞式的。
process.stdin
一个到标准输入的可读流Readable Stream。默认情况下标准输入流是暂停的,要从中读取内容需要调用方法process.stdin.resume()。
示例:打开标准输入与监听两个事件:
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
1: /Users/mjr/work/node/process-2.js
3: two=three
process.execPath
这是一个启动该进程的可执行程序的绝对路径名。
/usr/local/bin/node
process.chdir(directory)
改变进程的当前工作目录,如果操作失败则抛出异常。
console.log('Starting directory: ' + process.cwd());
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
一个包括用户环境的对象。可参见environ(7)。
process.exit(code=0)
用指定的code代码结束进程。如果不指定,退出时将使用'success'(成功)代码&0。
以'failure'(失败)代码退出的示例:
process.exit(1);
执行node的shell会把退出代码视为1。
process.getgid()
获取进程的群组标识(详见getgid(2))。这是一个数字的群组ID,不是群组名称。
console.log('Current gid: ' + process.getgid());
process.setgid(id)
设置进程的群组标识(详见getgid(2))。参数可以是一个数字ID或者群组名字符串。如果指定了一个群组名,这个方法会阻塞等待将群组名解析为数字ID。
console.log('Current gid: ' + process.getgid());
process.setgid(501);
console.log('New gid: ' + process.getgid());
catch (err) {
console.log('Failed to set gid: ' + err);
process.getuid()
获取进程的用户ID(详见getgid(2))。这是一个数字用户ID,不是用户名。
console.log('Current uid: ' + process.getuid());
process.setuid(id)
设置进程的用户ID(详见getgid(2))。参数可以使一个数字ID或者用户名字符串。如果指定了一个用户名,那么该方法会阻塞等待将用户名解析为数字ID。
console.log('Current uid: ' + process.getuid());
process.setuid(501);
console.log('New uid: ' + process.getuid());
catch (err) {
console.log('Failed to set uid: ' + err);
process.version
一个编译内置的属性,用于显示NODE_VERSION(Node版本)。
console.log('Version: ' + process.version);
process.installPrefix
一个编译内置的属性,用于显示NODE_PREFIX(Node安装路径前缀)。
console.log('Prefix: ' + process.installPrefix);
process.kill(pid, signal='SIGTERM')
发送一个信号到进程。pid是进程的ID,参数signal是欲发送信号的字符串描述。信号名称是像'SIGINT'或者'SIGUSR1'这样的字符串。如果参数signal忽略,则信号为'SIGTERM'。详见kill(2)。
注意该函数名为process.kill,实际上也就像kill系统调用一样仅仅是一个信号发送器。发送的信号可能是要终止目标进程,也可能是实现其他不同的目的。
一个给自己发送信号的示例:
process.on('SIGHUP', function () {
console.log('Got SIGHUP signal.');
setTimeout(function () {
console.log('Exiting.');
process.exit(0);
process.kill(process.pid, 'SIGHUP');
process.pid
进程的PID。
console.log('This process is pid ' + process.pid);
process.title
获取或设置在'ps'命令中显示的进程的标题。
process.platform
运行Node的平台信息,如'linux2','darwin'`等等。
console.log('This platform is ' + process.platform);
process.memoryUsage()
返回一个描述Node进程内存使用情况的对象。
var util = require('util');
console.log(util.inspect(process.memoryUsage()));
这会生成如下信息:
{ rss: 4935680,
heapTotal: 1826816,
heapUsed: 650472 }
heapTotal与heapUsed指V8的内存使用情况。
process.nextTick(callback)
在事件循环的下一次循环中调用callback回调函数。这不是setTimeout(fn, 0)的一个别名,因为它有效率多了。
process.nextTick(function () {
console.log('nextTick callback');
process.umask([mask])
设置或者读取进程的文件模式创建掩码。子进程从父进程中继承这个掩码。如果设定了参数mask那么返回旧的掩码,否则返回当前的掩码。
var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('Changed umask from: ' + oldmask.toString(8) +
' to ' + newmask.toString(8));
本文已收录于以下专栏:
相关文章推荐
子进程 child_process模块的基本介绍众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了...
NodeJS子进程简介
NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有:
标准输入、标准输出及标准错误输出的接口
child.stdin 获取标准输入child....
模块概览在node中,child_process这个模块非常重要。掌握了它,等于在node的世界开启了一扇新的大门。熟悉shell脚本的同学,可以用它来完成很多有意思的事情,比如文件压缩、增量部署等,...
child_process即子进程可以创建一个系统子进程并执行shell命令,在与系统层面的交互上挺有用处。
NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 
        Event: 'exit'
        Event: 'uncaughtException&#3...
Atitit js nodejs下的进程管理wmic process进程管理
C:\Users\Administrator&wmic process get name
转自:/softlover/archive//2707139.html
  虽然node对操作系统做了很多抽象的工作,...
Nodejs的特点是事件驱动,异步I/O产生的高并发,产生此特点的引擎是事件循环,事件被分门别类地归到对应的事件观察者上,比如idle观察者,定时器观察者,I/O观察者等等,事件循环每次循环称为Tic...
最近在看javacript异步教程这本书中看到了这么一行代码var fs = require('fs');
process.chdir('./main/recipe');
var concatenat...
关于nodejs中child_process之中spawn和exec的区别
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Nodejs进程管理模块forever详解
字体:[ ] 类型:转载 时间:
服务器管理是系统上线后,必须要面对的问题。最好有一个软件可以提供整套的服务器运行解决方案:要求运行稳定,支持高并发,启动/停止命令简单,支持热部署,宕机重启,监控界面和日志,集群环境。
接下来,就让我们看看forever能不能实现目标。一、forever介绍
forever是一个简单的命令式nodejs的守护进程,能够启动,停止,重启App应用。forever完全基于命令行操作,在forever进程之下,创建node的子进程,通过monitor监控node子进程的运行情况,一旦文件更新,或者进程挂掉,forever会自动重启node服务器,确保应用正常运行。
二、&forever安装
全局安装forever 代码如下:~ D:\workspace\javascript&npm install -g foreverD:\toolkit\nodejs\forever -& D:\toolkit\nodejs\node_modules\forever\bin\foreverD:\toolkit\nodejs\foreverd -& D:\toolkit\nodejs\node_modules\forever\bin\foreverd查看forever帮助 代码如下:~ D:\workspace\javascript&forever -hhelp: usage: forever [action] [options] SCRIPT [script-options]help:help: Monitors the script specified in the current process or as a daemonhelp:help: actions:help: start Start SCRIPT as a daemonhelp: stop Stop the daemon SCRIPThelp: stopall Stop all running forever scriptshelp: restart Restart the daemon SCRIPThelp: restartall Restart all running forever scriptshelp: list List all running forever scriptshelp: config Lists all forever user configurationhelp: set &key& &val& Sets the specified forever config &key&help: clear &key& Clears the specified forever config &key&help: logs Lists log files for all forever processeshelp: logs &script|index& Tails the logs for &script|index&help: columns add &col& Adds the specified column to the output in `forever list`help: columns rm &col& Removed the specified column from the output in `forever list`help: columns set &cols& Set all columns for the output in `forever list`help: cleanlogs [CAREFUL] Deletes all historical forever log fileshelp:help: options:help: -m MAX Only run the specified script MAX timeshelp: -l LOGFILE Logs the forever output to LOGFILEhelp: -o OUTFILE Logs stdout from child script to OUTFILEhelp: -e ERRFILE Logs stderr from child script to ERRFILEhelp: -p PATH Base path for all forever related files (pid files, etc.)help: -c COMMAND COMMAND to execute (defaults to node)help: -a, --append Append logshelp: -f, --fifo Stream logs to stdouthelp: -n, --number Number of log lines to printhelp: --pidFile The pid filehelp: --sourceDir The source directory for which SCRIPT is relative tohelp: --minUptime Minimum uptime (millis) for a script to not be considered "spinning"help: --spinSleepTime Time to wait (millis) between launches of a spinning script.help: --colors --no-colors will disable output coloringhelp: --plain alias of --no-colorshelp: -d, --debug Forces forever to log debug outputhelp: -v, --verbose Turns on the verbose messages from Foreverhelp: -s, --silent Run the child script silencing stdout and stderrhelp: -w, --watch Watch for file changeshelp: --watchDirectory Top-level directory to watch fromhelp: --watchIgnore To ignore pattern when watch is enabled (multiple option is allowed)help: -h, --help You're staring at ithelp:help: [Long Running Process]help: The forever process will continue to run outputting log messages to the console.help: ex. forever -o out.log -e err.log my-script.jshelp:help: [Daemon]help: The forever process will run as a daemon which will make the target process starthelp: in the background. This is extremely useful for remote starting simple node.js scriptshelp: without using nohup. It is recommended to run start with -o -l, & -e.help: ex. forever start -l forever.log -o out.log -e err.log my-daemon.jshelp: forever stop my-daemon.jshelp:
我们看到forever支持的命令和配置项确实不少,应该是偏命令行的管理工具。
三、forever命令行的中文解释
子命令actions: 代码如下:start:启动守护进程stop:停止守护进程stopall:停止所有的forever进程restart:重启守护进程restartall:重启所有的foever进程list:列表显示forever进程config:列出所有的用户配置项set &key& &val&: 设置用户配置项clear &key&: 清楚用户配置项logs: 列出所有forever进程的日志logs &script|index&: 显示最新的日志columns add &col&: 自定义指标到forever listcolumns rm &col&: 删除forever list的指标columns set&cols&: 设置所有的指标到forever listcleanlogs: 删除所有的forever历史日志配置参数options: 代码如下:-m MAX: 运行指定脚本的次数-l LOGFILE: 输出日志到LOGFILE-o OUTFILE: 输出控制台信息到OUTFILE-e ERRFILE: 输出控制台错误在ERRFILE-p PATH: 根目录-c COMMAND: 执行命令,默认是node-a, –append: 合并日志-f, –fifo: 流式日志输出-n, –number: 日志打印行数–pidFile: pid文件–sourceDir: 源代码目录–minUptime: 最小spinn更新时间(ms)–spinSleepTime: 两次spin间隔时间–colors: 控制台输出着色–plain: –no-colors的别名,控制台输出无色-d, –debug: debug模式-v, –verbose: 打印详细输出-s, –silent: 不打印日志和错误信息-w, –watch: 监控文件改变–watchDirectory: 监控顶级目录–watchIgnore: 通过模式匹配忽略监控-h, –help: 命令行帮助信息
四、forever服务器管理
创建一个web项目(express3+ejs),使用forever管理服务器。
安装express3 代码如下:~ D:\workspace\javascript&express -e nodejs-forever~ D:\workspace\javascript&cd nodejs-forever && npm install通过forever启动应用 代码如下:~ D:\workspace\javascript\nodejs-forever&forever start app.jswarn:&&& --minUptime not set. Defaulting to: 1000mswarn:&&& --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000msinfo:&&& Forever processing file: app.js
打开浏览器: http://localhost:3000,可以看到web界面
在win下面查看forever状态 代码如下:~ D:\workspace\javascript\nodejs-forever&forever listinfo:&&& No forever processes running
~ D:\workspace\javascript\nodejs-forever&forever stop app.jserror:&& Forever cannot find process with index: app.js我们发现forever的程序,工作不对了!!程序明明是运行状态,通过list确看不到。接下来,切换成Linux Ubuntu继续测试。
五、forever在Ubuntu进行服务器管理
Linux的系统环境
Linux: Ubuntu 12.04.2 64bit ServerNode: v0.11.2Npm: 1.2.21初始化项目:安装命令不解释了 代码如下:~ cd /home/conan/nodejs~ express -e nodejs-forever~ cd nodejs-forever && npm install~ sudo npm install forever -g启动forever 代码如下:~ forever start app.jswarn:&&& --minUptime not set. Defaulting to: 1000mswarn:&&& --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000msinfo:&&& Forever processing file: app.js查看node服务器状态 代码如下:~ forever listinfo:&&& Forever processes runningdata:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&&&&&&&&&&&&&&&& uptimedata:&&& [0] L2tY /usr/local/bin/node app.js 18276&& 18279 /home/conan/.forever/L2tY.log 0:0:0:37.792
# 系统进程~ ps -aux|grep nodeWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlconan&&& 1& 1.1 76 ?&&&&&&& Ssl& 15:48&& 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.jsconan&&& 1& 0.8 92 ?&&&&&&& Sl&& 15:48&& 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.js
# 端口占用~ netstat -nltp|grep nodetcp&&&&&&& 0&&&&& 0 0.0.0.0:3000&&&&&&&&&&& 0.0.0.0:*&&&&&&&&&&&&&& LISTEN&&&&& 18299/node
停止服务器 代码如下:~ forever stop app.jsinfo:&&& Forever stopped process:data:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&&&&&&&&&&&&&&&& uptime[0] L2tY /usr/local/bin/node app.js 18276&& 18279 /home/conan/.forever/L2tY.log 0:0:0:45.621
我们看到在Linux Ubuntu环境中是正常的。
六、模拟服务器宕机
两种测试方案:
1. 用Linux命令,直接杀死node进程2. 在应用中,模拟异常退出
1). 用Linux命令,直接杀死node进程 代码如下:# 查看node进程,PID=18299& ~ ps -aux|grep node
conan&&& 1& 1.1 76 ?&&&&&&& Ssl& 15:48&& 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.jsconan&&& 1& 0.8 92 ?&&&&&&& Sl&& 15:48&& 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.jsconan&&& 1& 0.0& 13584&& 956 pts/5&&& R+&& 15:52&& 0:00 grep --color=auto node
# 杀死PID=19299~ kill -9 18299
# 再看node进程,node自动重启,新的PID=18324& ~ ps -aux|grep node
conan&&& 1& 1.1 16 ?&&&&&&& Ssl& 15:48&& 0:00 /usr/local/bin/node /usr/local/lib/node_modules/forever/bin/monitor app.jsconan&&& 1& 0.8 12 ?&&&&&&& Sl&& 15:52&& 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.jsconan&&& 1& 0.0& 13584&& 956 pts/5&&& R+&& 15:52&& 0:00 grep --color=auto node我们看到看杀死node进程,forever会帮助我们,重启node。
杀死forever的monitor
代码如下:~ kill -9& 18296~ ps -aux|grep node
conan&&& 1& 0.9 44 ?&&&&&&& Sl&& 15:52&& 0:00 /usr/local/bin/node /home/conan/nodejs/nodejs-forever/app.jsconan&&& 1& 0.0& 13584&& 952 pts/5&&& S+&& 15:57&& 0:00 grep --color=auto node
# 再杀死node进程~ kill -9 18316~ ps -aux|grep node
conan&&& 1& 0.0& 13584&& 956 pts/5&&& S+&& 15:58&& 0:00 grep --color=auto node我们尝试杀死了forever的monitor,monitor程序没有自动重启,然后再杀死node进程后,node也不会自动重启了。
2). 在应用中,模拟异常退出修改文件:app.js 代码如下:~ vi app.js
//..http.createServer(app).listen(app.get('port'), function(){& console.log(new Date());& console.log('Express server listening on port ' + app.get('port'));});
setTimeout(function(){& console.log(new Date());& throw new Error('App is error from inner!');},10*1000);通过node命令启动 代码如下:~ node app.jsThu Sep 26 :44 GMT+0800 (CST)Express server listening on port 3000Thu Sep 26 :54 GMT+0800 (CST)
/home/conan/nodejs/nodejs-forever/app.js:41& throw new Error('App is error from inner!');&&&&&&& ^Error: App is error from inner!&&& at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)&&& at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)10秒后,由于内部错误, node进程挂掉了。
通过forever命令启动 代码如下:~ mkdir logs~ chmod 777 -R logs~ forever -p . -l ./logs/access.log -e ./logs/error.log start app.js
# 检查错误日志~ cat logs/access.log lsThu Sep 26 :02 GMT+0800 (CST)Express server listening on port 3000Thu Sep 26 :12 GMT+0800 (CST)
/home/conan/nodejs/nodejs-forever/app.js:41& throw new Error('App is error from inner!');&&&&&&& ^Error: App is error from inner!&&& at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)&&& at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)error: Forever detected script exited with code: 8error: Forever restarting script for 1 timeThu Sep 26 :13 GMT+0800 (CST)Express server listening on port 3000Thu Sep 26 :23 GMT+0800 (CST)
/home/conan/nodejs/nodejs-forever/app.js:41& throw new Error('App is error from inner!');&&&&&&& ^Error: App is error from inner!&&& at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)&&& at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)error: Forever detected script exited with code: 8error: Forever restarting script for 2 timeThu Sep 26 :23 GMT+0800 (CST)Express server listening on port 3000Thu Sep 26 :33 GMT+0800 (CST)
/home/conan/nodejs/nodejs-forever/app.js:41& throw new Error('App is error from inner!');&&&&&&& ^Error: App is error from inner!&&& at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)&&& at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)error: Forever detected script exited with code: 8error: Forever restarting script for 3 timeThu Sep 26 :33 GMT+0800 (CST)Express server listening on port 3000Thu Sep 26 :43 GMT+0800 (CST)
/home/conan/nodejs/nodejs-forever/app.js:41& throw new Error('App is error from inner!');&&&&&&& ^Error: App is error from inner!&&& at null._onTimeout (/home/conan/nodejs/nodejs-forever/app.js:41:9)&&& at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)error: Forever detected script exited with code: 8error: Forever restarting script for 4 time我们发现每10秒种,node内部挂掉,然后再被forever重启!!
通过list我们手动刷新几次也可以看到pid是变的。 代码如下:~ forever listinfo:&&& Forever processes runningdata:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&& uptimedata:&&& [0] SmtT /usr/local/bin/node app.js 18444&& 18579 logs/access.log 0:0:0:7.211
~ forever listinfo:&&& Forever processes runningdata:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&& uptimedata:&&& [0] SmtT /usr/local/bin/node app.js 18444&& 18579 logs/access.log 0:0:0:8.921
~ forever listinfo:&&& Forever processes runningdata:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&& uptimedata:&&& [0] SmtT /usr/local/bin/node app.js 18444&& 18604 logs/access.log 0:0:0:0.177
~ forever listinfo:&&& Forever processes runningdata:&&&&&&& uid& command&&&&&&&&&&&& script forever pid&& logfile&&&&&&&& uptimedata:&&& [0] SmtT /usr/local/bin/node app.js 18444&& 18604 logs/access.log 0:0:0:2.206这样forever就帮助我们完成了,几项比较重要服务器管理功能:“启动/停止命令简单”,“支持热部署”,“宕机重启”,“监控界面和日志”。
比起upstart管理,省略了配置脚本的步骤(/etc/init/nodejs-xx.conf)。其他的功能,还要更近一步的使用才知道。
七、开发环境和生产环境的启动配置
开发环境 代码如下:~ cd /home/conan/nodejs/nodejs-forever/~ forever -p . -l ./logs/access.log -e ./logs/error.log -a -w start app.js生产环境 代码如下:~ export LOG=/var/log/nodejs/project~ export PID=/var/log/nodejs/project/forever.pid~ export APP_PATH=/home/conan/nodejs/nodejs-forever~ export APP=$APP_PATH/app.js
~ forever -p $APP_PATH -l $LOG/access.log -e $LOG/error.log -o $LOG/out.log -a --pidFile $PID start $APP
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 nodejs process.on 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信