1. 前言
同学们在使用nohup和python的过程中,应该都遇到过,无法将python脚本中print输出的内容输出到指定的位置。例如:
nohup python3 test.py > /tmp/test.log &
首先,对于nohup命令的使用时没问题,之所以会出现上边的问题,是因为python的输出有缓冲,导致在/tmp/test.log中可能很快看不到输出内容
。为了避免python的缓冲,导致无法看到实时的输出,需要使用python的-u
参数。
nohup python3 -u test.py > /tmp/test.log &
这样就能在文件/tmp/test.log中马上看到print的输出了。
2. nohup和&使用详解
2.1 nohup
nohup是不挂起( no hang up)。nohup命令可以在你退出帐户之后继续运行相应的进程。在使用nohup
命令运行程序时,如果我们没有指定输出重定向到哪儿,默认则会输出重定向到nohup.out的文件中。
# nohup的使用格式
nohup command
# 例子
nohup python3 test.py
2.2 &
在终端运行某个作业,则该终端就被占据,无法在该终端运行其它作业了,因此需要在作业的命令后加上&
,意思就是让这个作业在后台运行而不在前台运行了。例如:
# 格式
command &
# 例子
python3 test.py &
但是,这样做还是有问题,当我们关闭了这个终端界面(例如在xshell中一个shell界面),那么就算是用&
后台运行的进程也会被kill掉。这时我们就需要同时使用nohup
和&
了。
nohup python3 test.py &
这样就算我们关闭了终端界面,程序一样运行。但是又有一个问题了,我不知道程序运行的情况了啊,看不见输出内容,不知道这个程序现在啥情况啊,这可咋整。这时候就需要将程序的输出重定向
到你所指定的文件中。
重定向输出通常使用>
和>>
,分别表示覆盖和追加。
在linux的重定向中: 0/1/2代表着不同的涵义。
- 0表示标准输入。
- 1标准输出。
- 2标准错误信息输出。
通过指明0/1/2来指定需要重定向内容是标准输入/标准输出/标准错误信息输出。默认重定向的内容是1(标准输出)。
在上面命令中将python3 test.py
的输出通过>
命令重定向到了/tmp/test.log
中
2.2 标准输出重定向
# 格式
nohup command 1> my_print.log &
# 默认就是标准输出,因此可以省略这个1
nohup command 1> my_print.log &
# 例子,表示把标准输出写入test_error.log文件中
python3 test.py > test_error.log
nohup python3 test.py > test_error.log &
2.3 标准错误重定向
# 格式
nohup command 2> my_error.log &
# 例子,表示把错误输出写入test_error.log文件中
python3 test.py 2> test_error.log
nohup python3 test.py 2> test_error.log &
**其实可以同时重定向多种输出。**例如:
python3 test.py > test_error.log 2> my_error.log
某些情况下,可能需要将标准输出、标准错误等都重定向至同一个文件。这个时候就需要使用2>&1
,意思时将标准错误重定向至标准输出。例如:
# 格式
nohup command > xx_file 2>&1 &
# 例子,这样就把标准输出和标准错误都重定向到test_error.log文件了。
python3 test.py > test_error.log 2>&1
# 结合nohup和&,后台运行程序
nohup python3 test.py > test_error.log 2>&1 & # 顺序不能变!!!
在这里的标准输出已经重定向到了test_error.log文件,而标准错误又重定向到了标准输出,所有都重定向到了test_error.log文件种。
2.4 忽略输出
需要忽略输出时只需要将输出重定向到/dev/null
,这就相当于时linux中的回收站。例如:
python3 test.py > /dev/null
3. 参考文献
[1] 用nohup重定向python输出到文件不成功的解决办法
[2] linux重定向及nohup不输出的方法
[3] linux后台执行命令:&和nohup
[4] 用nohup执行python程序时,print无法输出
[5] Linux学习】nohup后台运行程序以及输出重定向