linux-nohup-&-setsid-使用区别

最近使用Rabbitmq的时候,需要通过worker来执行某些任务,这些任务是通过nohup与&配合,放在后台执行的,这些执行都没有问题,但当我把worker给Ctrl+C 掉后,启动的任务也都给关掉了。
所以深入了研究了一下nohup、& 和 setsid

nohup

nohup命令的功能就是使用当前进程忽略hangup信号,从而继续执行。默认的标准输入输出都会被重定向到当前目录下的nohup.out文件里。一般我们配置在命令的末尾加上 & 来配合使用。
可以通过 >filename 2>&1 来重定向默认的输入输出, 如:”nohup minio server :9001 /mnt/test/ > /var/log/minio_test.log 2>&1 &”, 通过jobs 可以看到该进程的父进程是当前shell的进程号
作用说明:进程在后台执行;忽略hangup信号;重定向日志输出

&

& 代表后台运行程序。如果终端退出,则该进程会结束。通常配合nohup和setsid使用

setsid

setsid 就是set session id 的意思。表示该命令运行的进程是一个新的session。因此其父进程不属于当前终端。实际上setsid运行的进程,其父进程id(ppid)为1(init进程的id)。
如:”setsid minion server :9001 /mnt/test/ > /var/log/minio_test.log &”。注意:setsid输出重定向必须手动指定。

结论

由于nohup的父进程与当前的worker有关,当我们Ctrl+C的时候,也会把其给kill掉。而setsid的父进程是init,所以当我们退出worker的时候,并不会kill掉该服务