nohup是让一个进程忽略SIGHUP信号。语法
1 | nohup COMMAND [ARG] |
如果标准输入是一个终端,那么标准输入被重定向到一个unreadable file。
如果标准输出是一个终端,那么输出被追加到nohup.out。
如果标准错误是一个终端,那么背重定向到标准输出。
为了保存输出到一个文件,可以使用 nohup COMMAND > FILE
通过strace命令,查看nohup发生了啥,其实使用ltrace查看,更简单,nohup屏蔽了SIGHUP信号。然后execv用新进程替换了自己。根据参考1中的信息:
POSIX specifies that for
execve
signals whose handlers are eitherSIG_IGN
orSIG_DFL
are left unchanged: that is, an ignored signal is still ignored after anexecve
被忽略的信号,是可以继承。
ltrace只支持lazy bind。对于-z now编译的不支持。
参考
[1] https://github.com/golang/go/issues/20479
[2] https://stackoverflow.com/questions/43213505/no-output-when-running-ltrace
[3] https://bugzilla.redhat.com/show_bug.cgi?id=1333481