• 欢迎访问 winrains 的个人网站!
  • 本网站主要从互联网整理和收集了与Java、网络安全、Linux等技术相关的文章,供学习和研究使用。如有侵权,请留言告知,谢谢!

nohup和&的区别

Linux技术 winrains 来源:枣面包 1年前 (2019-08-31) 57次浏览

从 Linux信号机制 到 SIGINT和SIGHUP信号含义 到 nohup和&的区别,逐步解释

Linux信号机制

在计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

Linux信号列表

通过kill -l命令获得

[root@centos6-1 ~]# kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP<br>  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1<br> 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM<br> 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP<br> 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ<br> 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR<br> 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3<br> 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8<br> 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13<br> 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12<br> 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7<br> 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2<br> 63) SIGRTMAX-1  64) SIGRTMAX 

SIGINT信号

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

SIGHUP信号

本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

ctrl + c 产生SIGINT信号,关闭shell窗口产生SIGHUP信号

&

运行程序时在命令后边加一个”&“符号,&的意思是在后台运行

//这里使用启动storm服务举例

[root@centos6-1 bin]# cd /export/servers/apache-storm-1.1.1/bin/ [root@centos6-1 bin]# ./storm nimbus &<br> [1] 84994
[root@centos6-1 bin]# Running: /export/servers/jdk1.8.0_65/bin/java -server  -Ddaemon.name=nimbus<br> ^C
[root@centos6-1 bin]# jps<br> 84994 nimbus<br> 85133 Jps
[root@centos6-1 bin]# 
可以看到即使我们使用了ctrl + c ,storm的nimbus进程也依旧存活,但是当我们关掉当前shell窗口的话,进程就会被杀死。因为&只对SIGINT信号免疫,而对SIGHUP信号不免疫

nohup

nohup的意思是忽略SIGHUP信号

//这里使用nohup指令启动storm服务进程
[root@centos6-1 bin]# nohup ./storm nimbus
nohup: ignoring input and appending output to `nohup.out'  

克隆shell窗口查询进程,发现进程启动成功

[root@centos6-1 bin]# jps
85269 Jps
85181 nimbus
[root@centos6-1 bin]#

但是当我们ctrl + c 之后,storm进程就停止了

[root@centos6-1 bin]# nohup ./storm nimbus
nohup: ignoring input and appending output to `nohup.out'
^C
[root@centos6-1 bin]# jps
85381 Jps
[root@centos6-1 bin]#

可见nohup对对SIGINT信号并不免疫。

总结

所以,要想进程不受shell中Ctrl C和Shell窗口关闭的影响,就将nohup和&指令一起使用吧

[root@centos6-1 bin] # nohup ./storm nimbus &
[1] 85591
[root@centos6-1 bin] # nohup: ignoring input and appending output to `nohup.out'
^C
[root@centos6-1 bin] # jps<br> 85699 Jps<br> 85591 nimbus
[root@centos6-1 bin] #

作者:枣面包

来源:https://blog.csdn.net/weixin_37490221/article/details/81539341


版权声明:文末如注明作者和来源,则表示本文系转载,版权为原作者所有 | 本文如有侵权,请及时联系,承诺在收到消息后第一时间删除 | 如转载本文,请注明原文链接。
喜欢 (0)