Dan*_*obs 4 python bash stdout
我见过很多类似的问题,但问题是其他解决方案都没有解决我的问题。我想运行 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,但当我尝试在后台运行脚本时却不会。
知道我的问题是什么吗?我的问题与类似问题的不同之处在于我正在执行两个脚本,这可能是它不起作用的原因。
感谢@KamilCuk 的帮助!
添加一个-u选项解决了这个问题:
nohup python3 -u GUI.py > GUI.log 2>&1
nohup python3 -u main.py > main.log 2>&1
Run Code Online (Sandbox Code Playgroud)
但为什么这会起作用呢?
因为默认情况下,stdout/stderr 输出会被缓冲,并且仅以特定的时间间隔(例如每 1kB)刷新。“-u”选项消除了 python 的缓冲区,并将输出立即写入目的地。
注意:这个问题实际上是nohup-is-not-writing-log-to-output-file的重复