Linux中的nohup和&区别

·  阅读 1136

nohup和&区别

&:后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出。意思是说, 当你在执行 python test.py & 的时候, 即使你用ctrl C, 那么python test.py照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么, 这个python进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。

nohup: 即no hang up,不挂断的运行。nohup的意思是忽略SIGHUP信号, 所以当运行nohup python test.py的时候, 关闭shell, 那么这个python进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, 这个python进程也是会消失的(因为对SIGINT信号不免疫)

注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

代码准备

首先准备一个python测试代码,是一个输出HelloWorld和数字的死循环脚本,每输出一行就等待1秒:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time

var = 1
while var > 0 :  # 该条件永远为true,循环将无限执行下去

   print "HelloWorld: ", var
   var = var +1
   time.sleep(1)  #每输出一行就休眠1秒
复制代码

前台运行

python test.py
复制代码

程序每隔一秒会在终端输出一个字符串。

此时如果键入Ctrl+C ,程序会收到一个SIGINT信号,如果不做特殊处理,程序的默认行为是终止(如上图)。

后台运行

python test.py &
复制代码

如上图,首先会在终端显示进程号是8778

如果键入Ctrl + C,发出SIGINT信号,程序会继续运行吗?

下图所示,键入Ctrl + C程序仍然会继续运行:

执行ps -ef|grep test.py查询一下,程序进程确实存在,如下图所示:

此时如果关闭session即关闭xshell,程序会收到一个SIGHUP信号,此时会怎么样呢?

重新打开xshell的session,:

如上图,程序不会继续输出,而且执行ps -ef|grep test.py刚刚打开的进程以及被关闭了

nohup运行

nohup python test.py
复制代码

如上图,使用nohup 运行程序test.py,会发现:

  • 前台没有出现进程号
  • 有一个“忽略输入,输出至nohup.out”的提示
  • hello的输出也没有出现在前台

如上图,在另一个xshell的session的窗口执行ps -ef|grep test.py,会发现脚本已经在运行了,进程号是20085

在前一个图中提示输出至nohup.out的提示,那么我们在新打开的窗口去看看这里面是啥

vim nohup.out
复制代码

如上图,脚本的日志会在这个文件输出。

此时,如果我们关闭原来执行脚本的xshell的session,程序会收到一个SIGHUP信号,程序会不会关闭呢?

如上图,我们在新打开的xshell创建执行ps -ef | grep test.py发现,这个PID为20085的python进程还存在。

此时只能通过kill命令来杀死进程了:

kill -9 20085
复制代码

然后,再次ps一下,如下图,进程已经被杀掉了。

此时重新使用nohup执行一下这个python脚本:nohup python test.py

然后键入Ctrl+C,并且执行ps -ef | grep test.py查看一下进程:

如上图所示,键入Ctrl+C后,程序收到SIGINT信号后,进程直接关闭了。

后台不挂断运行

nohup&一起使用,我们来看看是什么情况:

使用以下指令运行程序:

nohup python test.py &
复制代码

如上图,使用nohup python test.py &运行程序后,可以看到:

  • 会在终端显示进程号是21503
  • 也会有一个“忽略输入,输出至nohup.out”的提示
  • 键入Ctrl + C,发送SIGINT信号,似乎没反应。

关闭session,发送SIGHUP信号,再打开一个session窗口ps一下:

如上图,ID为21503的进程依然存在,后续也只能用kill来关闭它。

总结

使用&后台运行程序:

  • 结果会输出到终端
  • 使用Ctrl + C发送SIGINT信号,程序免疫
  • 关闭session发送SIGHUP信号,程序关闭

使用nohup运行程序:

  • 结果默认会输出到nohup.out
  • 使用Ctrl + C发送SIGINT信号,程序关闭
  • 关闭session发送SIGHUP信号,程序免疫

使用nohup和&配合来启动程序:

  • 同时免疫SIGINT和SIGHUP信号

最佳实践方案:

不要将信息输出到终端标准输出,标准错误输出,而要用日志组件将信息记录到日志里

nohup命令可以将日志输入到文件中

  • 如果不指定输出文件,默认输出到当前目录下的nohup.out文件
  • 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

举个例子:

nohup python test.py > test.log 2>&1 &

nohup ping www.baidu.com > ping.log 2>&1 &
复制代码

转载文章:www.cnblogs.com/mingyue5826…

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改