问题由来
前台任务,独占命令行窗口,只有运行完了或者手动中止,才能执行其他命令。
前台任务变为后台任务
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
}).listen(5000);
- node app.js -----前台任务
- node app.js & -----加上&就变成了后台任务,如果让正在运行的前台任务变成后台任务,ctrl+z,然后执行bg命令(让最近暂停的后台任务继续执行)
- 后台任务的特点:
1.继承当前session的标准输出(stdout)和标准错误(stderr)。因此,后台任务的输出依然会进行。
2.不在继承session的标准输入。如果它试图读取标准输入,就会暂停执行
3.所以前后台任务的区别就是是否继承标准输入。所以执行后台任务的同时,还可以输入其他命令。
sighup信号
前台退出session执行的流程
1.用户准备退出session
2.系统向session发出sighup信号
3.session将sighup信号发给所有子进程
4.子进程收到sighup信号后自动退出。
后台任务不会收到sighup信号
shopt | grep huponexit 默认是off,如果是on,那么后台任务也会挺直
disdown命令
- disown可以将指定任务从后台任务列表移除,一个后台任务只要不在列表之中就必然不会收到sighup信号。
- node app.js &
- disown
标准io
执行disown命令退出session之后,如果与标准io有交互,他还是会挂掉
var http = require('http');
http.createServer(function(req, res) {
console.log('server starts...'); // 加入此行
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
}).listen(5000);
node app.js &
disown
在访问5000发现连不上,这是因为当前标准io不存在了,所以要重定向
node server.js > stdout.txt 2>stderr.txt</dev/null&
nohup命令
nohup node server.js&
- 阻止dighup信号发到该进程
- 关闭标准输入
- 重定向标准输出和标准错误
Screen 命令与 Tmux 命令
node工具
forever nodemon pm2