在后台启动Python进程时,用
nohup python myscript.py > test.log 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)
问题是stdout缓冲:数据不是实时写入的test.log.以常见的解决办法这个问题是定时冲洗用sys.stdout.flush(),甚至更好,因为提出这个答案,使用python -u:
nohup python -u myscript.py > test.log 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)
但这还不够.我注意到它在几个小时内工作,然后,它停止工作,即几个小时后test.log不再实时写入,即使我使用过nohup python -u ....
1)这是如何重现问题(我有一个标准的Debian Jessie).启动此文件:
import time
import datetime
while True:
print datetime.datetime.now()
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
与nohup python -u myscript.py > test.log 2>&1 < /dev/null &.日志文件将在几个小时内更新,然后在3或4小时后更新,不再有任何内容.
2)如何解决这个问题,而不必stdout.flush()在代码中插入每两行(丑陋的解决方案)?
print()在循环结构中使用 Python 的(或据我所知,任何其他控制台输出生成)函数并通过R 中的网状运行代码,输出仅在执行完成后打印。例如,采用以下循环,每次迭代后进入休眠状态 1.5 秒;循环结束后,运行号全部打印出来。将 Python 代码保存到单独的 .py 文件然后运行reticulate::py_run_file().
library(reticulate)
py_run_string("
import time
for i in range(5):
print(str(i))
time.sleep(1.5) # sleep for 1.5 sec
")
Run Code Online (Sandbox Code Playgroud)
有谁知道这种行为的来源,如果可能的话,如何规避它?
我见过很多类似的问题,但问题是其他解决方案都没有解决我的问题。我想运行 2 个 python 脚本并使用 .redirect 将它们的输出重定向到单独的日志文件nohup。
此代码位于名为的 bash 脚本中startmain:
nohup python3 GUI.py > GUI.log 2>&1 &
nohup python3 main.py > main.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)
当我运行时sh startmain,脚本都会执行,但不会将任何内容写入任一日志文件。
现在假设我startmain通过删除&行末尾的字符来更改代码:
nohup python3 GUI.py > GUI.log 2>&1
nohup python3 main.py > main.log 2>&1
Run Code Online (Sandbox Code Playgroud)
这段代码表示我不希望脚本在后台运行,因此只有 GUI.py 运行;然而,这里它实际上将 GUI.py 的所有输出定向到 GUI.log。我知道为什么 main.py 不在这里运行,但我不知道为什么在这种情况下输出会写入 GUI.log,但当我尝试在后台运行脚本时却不会。
知道我的问题是什么吗?我的问题与类似问题的不同之处在于我正在执行两个脚本,这可能是它不起作用的原因。