这几天工作中遇到一个问题,后台运行python脚本,存储输出日志到linux系统中,因为在脚本中用了大量的print,导致输出很多信息,服务器内存占满了光是log就有120G,因此写下这篇博客,记录后台运行python脚本的一些方法和保留日志信息的参数
常见的命令
command >/dev/null 2>&1 & command >/dev/null 2>python.log & command >python.log 2>&1 & command >/dev/null 2>log &
command:python test.py
下面将对这些命令的符号进行解释:
文件重定向运算符 – ‘>’:“>”符号被称为文件重定向运算符。其目的是将其左侧的命令指向右侧的命令。用更简单的语言来说,左边的任何数据字符串都将定向到运算符的右侧。定向大致意思就类似于文件写入的意思
末尾的&:指在后台运行
/dev/null
/dev/null是一个空设备——一种特殊类型的虚拟设备。它存在于每个Linux系统中,此设备的目的是丢弃发送到它的任何东西,并读取文件结束(EOF)。大多数虚拟设备用于读取数据;然而,/dev/null是唯一的,因为它用于抑制写入它的任何数据。简而言之,它充当Linux操作系统中的数据黑洞,数据写进来了,就没有了
文件描述符 – ‘0’,‘1’,‘2’
Linux中的每个命令执行都会生成三个相关文件:标准输入、标准输出和标准错误文件。Linux操作系统是指每个文件都有一个唯一的非负整数。
- 标准输入为“0”
- 标准输出为“1”
- 标准错误为“2”
从上图可以看到,只有标准输出, 和标准错误,才会显示到screen中,才能写入到log中
标准输入、标准输出和标准误差流的技术术语分别为stdin、stdout和stderr
到这里可以发现/dev/null,和log文件可以看成是二个存放数据的容器,而文件描述符1和2可以看成是输出的数据,我们通过文件重定向运算符,将数据写入到指定的容器中,注意的是2可以写入到1中
2>&1 我们正在将标准错误输出(2的文件描述符)重定向到标准输出(1的文件描述符)。符号&在2>&1意味着1是一个目标文件描述符。
其中command >/dev/null 默认将文件描述1 给/dev/null了
那么这些命令不同组合下来就有:
组合 |
2>/dev/null |
1>/dev/null |
2>$1 |
1>test.log |
2>test.log |
nohup和tmux
nohup就是 no hang up的意思,主要功能是你在退出账户/关闭终端之后继续运行相应的进程,不挂断的运行,注意并没有后台运行的功能,一定要结合&使用才能实现后台运行功能,如果不末尾不加&,control+C,程序就挂断了。
nohup commond >/dev/null 2>python.log & nohup python test.py &
Tmux是一个非常强大的终端多路复用器,非常有用,特别是当您通过SSH使用远程服务器时。
如果我们想在远程服务器上同时执行多项任务,通常我们有两种方法。我们可以将SSH到远程服务器中,并在每个终端命令的末尾运行所有内容。如果您想监控每项任务的进程,这是有问题的。我们还可以打开多个窗口,将SSH放入每个窗口的远程服务器,并为每个窗口运行一个任务。
tmux的功能简单说就是为终端多开几个窗口,执行完运行脚本,通过命令exit实现关闭窗口