实际上很多时候很容易在服务器环境发现linux nohup xxx > /dev/null 2>&1 &,只不过经常是输出到某个文件而不是/dev/null。实际上很多指令是很好理解的,唯独2>&1很奇特。介绍这些指令的原理。
nohup | xxx | > | /dev/null | 2 | > | &1 | & |
nohup指令 | 执行的命令 | 标准输出符 | 仅写入的虚拟硬件 | stderr标准错误 | &1的&表示文件描述符,&1的1表示stdout标准输出 | &单字符表示后台运行 |
各个指令逐一解析
1. nohup: no hang up(不挂起),hang是悬挂的意思,表示关闭终端tty等,退出账号,进程仍然保持运行,&也有相同的意思,所以一般配合&一起使用。
2. xxx:表示执行的指令
3. > >>:实际上有2种重定向输出符,>表示覆盖写入文件;>>表示追加写入文件。
/dev/null:/dev表示设备文件,因为Linux一切皆文件,null表示这个文件是无意义文件,笔者最开始觉得这个文件是表示不存在的文件,实际上不是的,这个文件是有定义的
4. 2>&1:这个就涉及shell的设计了
在 shell 中,常用的 FD (file descriptor,文件描述符) 有三个
0 :标准输入(stdin)
1 :标准输出(stdout)
2 :标准错误(stderr)
在标准情况下, 这些文件描述符关联设备:
stdin(0): keyboard 键盘输入 返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端
其中当> >>等输出重定向符需要输出stdout stderr时需要特别标记文件描述符&,否则会被认为是文件,输入不需要,实际上输入也是可以使用&的,比如&>1.log,表示把标准输出和标准错误输出都重定向到文件1.log中
5. &符号:单个&符号表示后台运行,类似nohup,一般配合nohup使用
linux运行程序一般就会使用上面的命令,来达到后台运行,精确输出重定向的能力,不会因为tty 用户的退出而退出,一般直接运行程序,如果没有特殊处理,是会被ctrl+c,或者终端退出,用户退出而结束进程。