当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Linux 下nohup 和 &有什么联系呢?

    栏目:Linux/apache问题 时间:2018-12-04 14:36

      背景
      一直没搞清楚 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 &