Linux 下 nohup 与 & 的联系

背景

一直没搞清楚 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@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]#

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

可用 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 &

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

栗子博客 软件 Linux 下 nohup 与 & 的联系 https://www.lizi.tw/soft/12628.html

常见问题
  • 1、杰齐1.7仅适用于PHP5.2 2、需Zend支持 3、尽量使用宝塔面板 4、尽量使用Windows 系统,关关对Linux支持不太友好。
查看详情

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

Linux 下 nohup 与 & 的联系-海报

分享本文封面