背景
一直没搞清楚 nohup 与 & 的区别, 看着公司里遗留的shell, 也就稀里糊涂地用着… 这是很糟糕的态度
结论放前面
&
使进程在后台运行, 默认输出到标准输出(即当前屏幕), 除非重定向输出.
此时忽略 SIGINT 信号.
若关闭会话, 则进程会结束
nohup
进程仍旧在前台跑, 默认输出到 nohup.out .
此时进程忽略 SIGHUP 信号, 关闭会话不影响进程.
Ctrl+c会使进程中断
nohup + &
进程在后台跑, 忽略 SIGINT, SIGHUP 信号.
测试
repeat=${1:-20}
echo 循环次数 $repeat
counter=0
while [ $counter -lt
r
e
p
e
a
t
]
d
o
e
c
h
o
第
repeat ] do echo 第
r
e
p
e
a
t
]
d
o
e
c
h
o
第
{counter}次循环
let “counter ++”
sleep 1
done
echo 结束循环
直接运行
[root@linuxidc tmp]# sh
test.sh
循环次数 20
第0次循环
第1次循环
第2次循环
^C
此时不论是直接 Ctrl+c 或 关闭当前ssh连接, 都会导致进程停止
[root@linuxidc tmp]# sh
test.sh
> test.out
^C
此时进程仍在前端跑, 查看 test.out 文件会发现在输出, 此时不论是直接 Ctrl+C 或 关闭当前ssh连接, 都会导致进程停止
单独使用 &
[root@linuxidc tmp]# sh
test.sh
&
[1] 111418
[root@linuxidc tmp]# 循环次数 20
第0次循环
第1次循环
第2次循环
^C
[root@linuxidc tmp]# 第3次循环
第4次循环
第5次循环
^C
[root@linuxidc tmp]# 第6次循环
第7次循环
第8次循环
第9次循环
第10次循环
第11次循环
此时进程在后台跑, 同时默认会输出到屏幕上.
此时 Ctrl+c 无效, 即进程忽略了 SIGINT 信号.
但若是直接关闭ssh连接(会话), 则该进程会被关闭, 这是因为进程受到了 SIGHUP 信号影响.
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
[root@linuxidc tmp]# sh
test.sh
> test.out &
[4] 111758
[root@linuxidc tmp]# http://www.iis7.com/a/lm/ftp/
使进程在后台跑, 输出被重定向到指定文件
可用 jobs -l 获取当前的所有后台进程
[root@linuxidc tmp]# jobs -l
[2]+ 113043 Running sh
test.sh
> /dev/null &
单独使用 nohup
[root@linuxidc tmp]# nohup sh
test.sh
> test.out 2>&1
运行后是在前端跑, 若关闭会话, 进程不受影响.
但此时 Ctrl+c会结束进程.
nohup + &
[root@linuxidc tmp]# nohup sh
test.sh
&
[2] 112987
[root@linuxidc tmp]# nohup: 忽略输入并把输出追加到"nohup.out"
[root@linuxidc tmp]#
忽略 Ctrl+c 以及 会话关闭的影响, 进程可以在后台持续运行.
若会话未关闭, 可通过 jobs -l 查看当前该进程
[root@linuxidc tmp]# jobs -l
[1]+ 112987 Running nohup sh
test.sh
&
站在用户的角度思考问题,与客户深入沟通,找到蜀山网站设计与蜀山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站制作、企业官网、英文网站、手机端网站、网站推广、主机域名、虚拟主机、企业邮箱。业务覆盖蜀山地区。