前台任务与后台任务
写一个简单node脚本server.js
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
}).listen(5000);
前台任务
运行命令
node server.js
上面这样启动的脚本,称为"前台任务"(foreground job)。它会独占命令行窗口,只有运行完了或者手动中止,才能执行其他命令。
并且一旦退出命令行窗口,这个应用就一起退出了,无法访问了。
后台任务
运行命令
node server.js &
在命令的尾部加上符号&,启动的进程就会成为"后台任务"。
前后台任务切换
- 后台切换成前台
查看当前后台任务
jobs
结果显示:
[1]+ Stopped node server.js
运行命令
fg 1
任务切换为前台。
- 前台切换为后台
可以先按ctrl + z,然后执行bg命令(让最近一个暂停的"后台任务"继续执行)。
SIGHUP信号
Linux系统SIGHUP信号设计
用户准备退出 session
系统向该 session 发出SIGHUP信号
session 将SIGHUP信号发给所有子进程
子进程收到SIGHUP信号后,自动退出
"后台任务"是否也会收到SIGHUP信号?这由 Shell 的huponexit参数决定的。
shopt | grep huponexit
执行上面的命令,就会看到huponexit参数的值。
大多数Linux系统,这个参数默认关闭(off)。因此"后台任务"不会随着 session 一起退出。
- huponexit设置
将huponexit设置为off
shopt -u huponexit
将huponexit设置为on
shopt -s huponexit
查看当前系统huponexit对应的值
shopt | grep onexit
当huponexit为on时,输入命令exit时后台任务会收到SIGHUP信号而退出。
守护进程
nohup
nohup 的用途就是让提交的命令忽略 hangup 信号。
nohup node server.js
标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
disown
使用disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
node server.js
disown
disown用法
# 移出最近一个正在执行的后台任务
disown
# 移出所有正在执行的后台任务
disown -r
# 移出所有后台任务
disown -a
# 不移出后台任务,但是让它们不会收到SIGHUP信号
disown -h
# 根据jobId,移出指定的后台任务
disown %2
disown -h %2
网友评论