Linux-文件描述符/stdin stdout stderr/linux后台运行的实现
1.文件描述符
概念:计算机操作系统中被打开文件的唯一标识. 它用来描述一种数据资源, 以及这个数据资源可以如何被访问到
描述符由唯一非负整数标识, 如 1, 2, ... 对于每个被打开的文件, 至少有一个文件描述符
2. stdin stdout stderr
在Unix系统中,前三个文件描述符0, 1, 2 默认为 stdin stdout stderr
可以将其理解为“流”:从键盘输入字符到 stdin, 数据经过 stdin 然后到达某个程序, 被程序处理之后需要展示的数据流向 stdout 或者 stderr(如果有错误产生), 最后屏幕显示相关的 stdin 和 stderr(如果有错误产生).
3.重定向文件描述符
例子1:把stderr 重定向到/dev/null 当中
ls s.file 2>/dev/null
这时候终端不会输出错误信息了,因为 stderr 信息流被重定向到 Linux 当中的"/dev/null"去了.
例子2:标准输出重定向到 b.txt 文件当中
veronica@localhost ~ % ls a.txt 1>b.txt
veronica@localhost ~ % cat b.txt a.txt
此时我们利用cat命令查看stdout重定向后的文件得到a.txt, 也就是说成功把stdout的数据流定向到b.txt这个文件当中
1 可以被省略, Linux 默认为标准输出重定向.
4. 利用文件描述符 实现 linux 下后台运行python脚本
nohup python -u test.py > out.log 2>&1 &
nohup : 不挂断的运行,并不是后台运行的功能。就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
-u:使用-u参数,使得python不启用缓冲。当python的输出有缓冲,会导致out.log
并不能够马上看到输出。
1是标准输出(STDOUT
)的文件描述符, 1> out.log
简化为 > python.log
,表示把标准输出重定向到out.log
这个文件
2>&1
表示把标准错误重定向到标准输出,这里&1表示标准输出。为什么需要将标准错误重定向到标准输出的原因,是因为标准错误没有缓冲区,而STDOUT有。
如果只有nohup,而没有最后的&,则关闭标准输入,终端不再能够接收任何输入;
有了最后的&,依然可以使用标准输入,终端能够接收任何输入。
参考链接:https://zhuanlan.zhihu.com/p/99120125
https://www.jianshu.com/p/4041c4e6e1b0