java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup? 下面我来扒一扒:
java -jar a.jar &
直接启动jar文件,在当前会话进程中开启一个子进程来运行程序,这个子进程会随着会话进程的结束而结束。
这种情况适合短时间测试用。
nohup java -jar a.jar &
hangup :(挂断),终端退出时会发送 hangup 信号来通知其关闭所有子进程。
nohup :(不挂断,忽略挂断信号)。
nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”>filename2>&1”来更改缺省的重定向文件名。
这种情况适合在生产环境长时间运行。
nodejs应用在linux上运行
使用场景
- forever管理多个站点,每个站点访问量不大,不需要监控。
- supervisor是开发环境用。
- nodemon 是开发环境使用,修改自动重启。
- pm2 网站访问量比较大,需要完整的监控界面。
forever
1
2
3
4
5
6npm install -g forever
forever start index.js -o out.log -e err.log
forever list
forever stop index.js [id]
forever stopall
forever restartallsupervisor 热部署
1
2npm install -g supervisor
supervisor app.js // 文件有改动会立即重启node模块nodemon
1
2npm install -g nodemon
nodemon app.jsnohup
1
2nohup node index.js &
nohup node index.js > myLog.log 2>&1 &
nohup问题:
但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,查看nohup.out可以看到在关闭终端瞬间服务自动关闭。 有个操作终端时的细节:当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端; 而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。
- 高大上的pm2
特性:
- 内建负载均衡(使用Node cluster 集群模块)
- 后台运行
- 0秒停机重载,维护升级的时候不需要停机
- 具有Ubuntu和CentOS 的启动脚本
- 停止不稳定的进程(避免无限循环)
- 控制台检测
- 提供 HTTP API
- 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )
使用:
1 | npm install -g pm2 |