别把&和nohup混为一谈 ------ ./a.out & , nohut ./a.out , nohup ./a.out &的区别
程序员文章站
2024-03-26 12:28:35
...
在第一家公司工作的时候, 我认识了&,在第二家公司工作的时候, 我认识了nohup, 这就是渊源。 随后, 我就一直糊涂用他们, 但并不懂这两个东西。 网上很多地方是乱扯, 瞎复制, 为什么不自己实践一下呢?
#include <stdio.h>
#include <unistd.h>
int main ()
{
int x = 0;
while(1)
{
printf("hello %d, pid %u, ppid %d\n", x++, getpid(), getppid());
sleep(1);
}
return 0;
}
看个小程序:
生成可执行程序a.out, 下面, 我会在我的linux机器上进行测试!!!
&的意思是在后台运行, 什么意思呢? 意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C, 那么a.out照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么, a.out进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。
nohup的意思是忽略SIGHUP信号, 所以当运行nohup ./a.out的时候, 关闭shell, 那么a.out进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, a.out进程也是会消失的(因为对SIGINT信号不免疫)
所以, &和nohup没有半毛钱的关系, 要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用nohua ./a.out &吧, 两全其美。
如果你懂守护进程, 那么nohup ./a.out &颇有点让a.out成为守护进程的感觉。
有时候出现一个奇怪的问题,我执行以下命令
nohup sh start_server.sh &
后,程序在后台开始执行,但是当我直接关闭终端后,程序在后台停止执行了。在其它机器上,并没有出现这种情况。网上查了查,以下方法试了试,成功了
nohup命令执行后,不要直接关闭终端,使用exit命令退出会话