默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), 和stderr (错误消息输出到屏幕上).
每个打开的文件都会被分配一个文件描述符.[1]stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2
一个常用的技巧:
有时ssh登录,后台执行命令后,无法退出
因为 stdin(0)、stdout(1)、stderr(2)输出都未关闭,而默认情况下0、1、2是和终端(或伪终端)相关联的。
那些正确设计的daemon程序都会在进入后台之前关闭0、1、2这三个fd,所以不会出现这个问题
对于SHELL脚本来说,在合适的位置(进入死循环之前或需长时间运行的命令之前)执行
exec 1>/dev/null 2>/dev/null 0</dev/null,或者根据需要重定向到其它文件,就可以解决这个问题。
对于已经写好,且又不想修改它,可以在命令行中做好这个重定向:
nohup ./program args 0</dev/null 1>/dev/null 2>&1 &
简单起见可以
nohup ./program args 0<&- 1>&- 2>&- &