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

posted @ 2021-03-10 22:08  Pikachuuuuu  阅读(230)  评论(0)    收藏  举报