当前位置: 移动技术网 > 科技>操作系统>Linux > [原创] Linux 中的 nohup 与 &

[原创] Linux 中的 nohup 与 &

2018年11月30日  | 移动技术网科技  | 我要评论
[TOC] 背景 一直没搞清楚 与 的区别, 看着公司里遗留的shell, 也就稀里糊涂地用着... 这是很糟糕的态度 结论放前面 使进程在后台运行, 默认输出到标准输出(即当前屏幕), 除非重定向输出. 此时忽略 SIGINT 信号. ==若关闭会话, 则进程会结束== 进程仍旧在前台跑, 默认输 ...

目录

背景

一直没搞清楚 nohup& 的区别, 看着公司里遗留的shell, 也就稀里糊涂地用着... 这是很糟糕的态度

结论放前面

&

使进程在后台运行, 默认输出到标准输出(即当前屏幕), 除非重定向输出.

此时忽略 sigint 信号.

==若关闭会话, 则进程会结束==


nohup

进程仍旧在前台跑, 默认输出到 nohup.out .

此时进程忽略 sighup 信号, 关闭会话不影响进程.

==ctrl+c会使进程中断==


nohup + &

进程在后台跑, 忽略 sigint, sighup 信号.

测试

repeat=${1:-20}
echo 循环次数 $repeat
counter=0
while [ $counter -lt $repeat ]
do
    echo 第${counter}次循环
    let "counter ++"
    sleep 1
done
echo 结束循环

直接运行

[root@yjx214 tmp]# sh test.sh
循环次数 20
第0次循环
第1次循环
第2次循环
^c

此时不论是直接 ctrl+c 或 关闭当前ssh连接, 都会导致进程停止

[root@yjx214 tmp]# sh test.sh > test.out
^c

此时进程仍在前端跑, 查看 test.out 文件会发现在输出, 此时不论是直接 ctrl+c 或 关闭当前ssh连接, 都会导致进程停止

单独使用 &

[root@yjx214 tmp]# sh test.sh &
[1] 111418
[root@yjx214 tmp]# 循环次数 20
第0次循环
第1次循环
第2次循环
^c
[root@yjx214 tmp]# 第3次循环
第4次循环
第5次循环
^c
[root@yjx214 tmp]# 第6次循环
第7次循环
第8次循环
第9次循环
第10次循环
第11次循环

此时进程在后台跑, 同时默认会输出到屏幕上.

此时 ctrl+c 无效, 即进程忽略了 sigint 信号.

但若是直接关闭ssh连接(会话), 则该进程会被关闭, 这是因为进程受到了 sighup 信号影响.

系统对sighup信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
  

[root@yjx214 tmp]# sh test.sh > test.out &
[4] 111758
[root@yjx214 tmp]#

使进程在后台跑, 输出被重定向到指定文件

可用 jobs -l 获取当前的所有后台进程

[root@yjx214 tmp]# jobs -l
[2]+ 113043 running                 sh test.sh > /dev/null &

单独使用 nohup

[root@yjx214 tmp]# nohup sh test.sh > test.out 2>&1

运行后是在前端跑, 若关闭会话, 进程不受影响.

但此时 ctrl+c会结束进程.

nohup + &

[root@yjx214 tmp]# nohup sh test.sh &
[2] 112987
[root@yjx214 tmp]# nohup: 忽略输入并把输出追加到"nohup.out"

[root@yjx214 tmp]#

忽略 ctrl+c 以及 会话关闭的影响, 进程可以在后台持续运行.

若会话未关闭, 可通过 jobs -l 查看当前该进程

[root@yjx214 tmp]# jobs -l
[1]+ 112987 running                 nohup sh test.sh &

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网