ITPub博客

首页 > > > 一分钟了解nohup和&的功效

一分钟了解nohup和&的功效

作者:58沈剑 时间:2019-12-30 15:23:21 0 删除 编辑

上一篇《服务挂了,怎么自动恢复?》中留了一个作业,nohup和&究竟有啥区别?不少同学进行了回复,但并不是所有同学都理解得全对,今天把自己挖的坑自己填了。

 

测试代码如下:


是一个输出hello与循环轮数的死循环程序,每输出一行就休眠1秒。

 

使用 ./a.out 前台运行程序,会是什么效果呢?


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

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

 

使用 ./a.out& 后台运行程序,会是什么效果呢?


如上图:

  • 首先会在终端显示进程号是32389

  • 键入Ctrl + C,发出SIGINT信号,程序会继续运行

 

ps确认一下,确认进程依然在运行,进程号是32389。


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


ps再次确认,可以看到关闭session之后,进程号是32389的a.out进程也关闭了。

 

使用nohup ./a.out 又会是什么效果呢?


使用nohup 运行程序a.out,会发现:

  • 前台没有出现进程号

  • 有一个“忽略输入,输出至nohup.out”的提示

  • hello的输出也没有出现在前台

 

手动ps看进程号,这次a.out的进程号是32437。

 

此时如果关掉session,程序会收到一个SIGHUP信号,程序会不会关闭呢?


关掉session后,再次ps看一下,ID为32437的a.out进程还在。


这些只能通过kill把程序干掉了,killall之后,ps查看进程已经关闭。


killall之后,查看发现多了一个nohup.out文件,不过这个文件的大小是0,有点奇怪,启动程序的时候,明明提示了“appending output to nohup.out”呀,先把问题遗留在这,测试一下Ctrl +C。

仍如上图,使用nohup启动a.out,如果键入Ctrl+C ,程序收到SIGINT信号后,直接关闭了。

 

最后测试一下nohup和&同时使用,即用nohup./a.out &运行程序,又会是什么效果呢?


使用nohup ./a.out &运行程序后,可以看到:

  • 会在终端显示进程号是32524

  • 也会有一个“忽略输入,输出至nohup.out”的提示

 

键入Ctrl + C,发送SIGINT信号,似乎没反应。

关闭session,发送SIGHUP信号,再来看看。


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

 

结论

使用&后台运行程序:

  • 结果会输出到终端

  • 使用Ctrl + C发送SIGINT信号,程序免疫

  • 关闭session发送SIGHUP信号,程序关闭

 

使用nohup运行程序:

  • 结果默认会输出到nohup.out

  • 使用Ctrl + C发送SIGINT信号,程序关闭

  • 关闭session发送SIGHUP信号,程序免疫

 

平日线上经常使用nohup和&配合来启动程序:

  • 同时免疫SIGINT和SIGHUP信号

 

同时,还有一个最佳实践:

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

 

如果觉得治学还算严谨,帮忙转一下。

 

尾巴

nohup启动a.out,程序终止后,为啥nohup.out的大小是0?“hello”的字符串哪去了?


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31556838/viewspace-3118709/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
58速运CTO,互联网架构技术专家,“架构师之路”公众号作者。曾任百度高级工程师,58同城技术委员会主席,高级架构师,58到家技术委员会主席,高级技术总监,目前主要负责58速运技术部。

注册时间:2018-09-30

  • 博文量
    420
  • 访问量
    82589