nohup 一般配合 & 来使用,将一个进程标记为后台运行,即使终端退出,也不会被杀死。
本以为 nohup 是一个 shell builtin,但他其实是个 bin 文件。
nohup 的本质是忽略 SIGHUP(1) 信号。因为终端退出时,杀死子进程就是通过发送 SIGHUP 实现的。
因此类似的,可以有几种方法达到类似 nohup 的效果
setsid command
。 setsid
可以创建新的 session 和进程组,并把 command
作为 leader 和 组长。这样就可以直接将 command
放到 1 号进程下面,不作为终端的子进程。这样终端也管不着他。好处是不像 nohup
一样,这样启动的 command
可以响应 hup 信号。disown
。先用 command &
放到后台,然后 disown
解除跟终端的关系。这样终端也管不着他。#!/bin/bash
trap '' HUP INT TERM
exec sleep 100 # sleep 100 进程就不会收到 SIGHUP/SIGINT/SIGTERM 信号。
但是这里只能忽略,不能有别的处理程序,不然 exec 替换进程无法继承之前的信号处理函数。