nohup 与 & 区别

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


Linux信号机制

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

Linux信号列表

通过kill -l命令获得

信号类型

  • SIGINT信号

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

  • SIGHUP信号

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

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

比较 & 和 nohup


测试代码如下:

用C写一个脚本,test.out,脚本内容如下:

#include <stdio.h>

void main()
{
    int i=0;
	while(1){
		printf("hello,%d\n", i++);
		sleep(1);
	}

}

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

直接执行脚本

./test.out

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

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

关闭 session, 程序会收到一个SIGHUP信号,如果不做特殊处理,程序的默认行为是终止。

&

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

执行脚本 ./test.out &

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

查看进程号 ps -aux | fgrep test.out

此时键入Ctrl + C,发出SIGINT信号,程序会继续运行。(查看进程号,进程号依旧在,且进程号一样。)

如果关掉session,程序会收到一个SIGHUP信号, 进程终止。(查看进程号,进程不在。)

nohup

nohup: no hang up,不挂起,忽略SIGHUP信号。

执行脚本 nohup ./test.out

发现此时终端没有像之前那样,每隔一秒输出一个字符串

查看进程号 ps -aux | fgrep test.out,进程存在。

此时键入Ctrl + C,发出SIGINT信号,程序终止。(查看进程号,进程不在。)

如果关掉session,程序会收到一个SIGHUP信号, 进程终止。(查看进程号,进程号依旧在,且进程号一样。)

结论

  • 使用&后台运行程序:
- 结果会输出到终端;
- 使用 Ctrl + C 发送SIGINT信号,程序免疫;
- 关闭session发送SIGHUP信号,程序关闭
  • 使用nohup运行程序:
- 结果默认会输出到nohup.out(不会输出到终端);
- 使用Ctrl + C 发送SIGINT信号,程序关闭;
- 关闭 session 发送SIGHUP信号,程序免疫

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

nohup ./test.out &

同时免疫SIGINT和SIGHUP信号 。

一般不将nohup输出到 nohup.out 文件,若所有的nohup都输出到到该文件,则该文件会很大,而是将各自输出重定向其他的文件。(如日志文件)

转载于:https://my.oschina.net/u/3683692/blog/3033856

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值