使用 shell 脚本重定向 python 输出来运行 Python 脚本

使用 shell 脚本重定向 python 输出来运行 Python 脚本

我正在使用 shell 脚本运行 python 脚本,run.sh以便在崩溃时重新启动它:

#!/bin/sh

COMMAND='nohup python3 -u test.py run >> py.log &'
LOGFILE=restart.txt

writelog() {
  now=`date`
  echo "$now $*" >> $LOGFILE
}

writelog "Starting"
while true ; do
  $COMMAND
  writelog "Exited with status $?"
  writelog "Restarting"
done

我在跑

nohup sh -u run.sh > output&

问题是 python 只会将第一个输出(print())流式传输到 py.log。我怎样才能立即输出流式传输。我也尝试过COMMAND=./test.py run >> py.log &。我将不胜感激的帮助。谢谢。

答案1

您的 shell 脚本正在将字符串传递'run >> py.log &'给您的test.py脚本,这可能会导致它无法正确运行。

您需要稍微更改一下脚本:

#!/bin/sh

COMMAND='nohup python3 -u test.py run'
LOGFILE=restart.txt

writelog() {
  now=`date`
  echo "$now $*" >> $LOGFILE
}

writelog "Starting"
while true ; do
  $COMMAND >> py.log &
  writelog "Exited with status $?"
  writelog "Restarting"
done

现在您$COMMAND将在后台运行并将其输出附加到py.log.

原始脚本不起作用的原因是,设置输出重定向后,shell 变量会扩展,因此 和>>不再&被识别为 shell 命令的一部分,并作为参数字符串传递给 Python 脚本。您可以参考LESS='+/SIMPLE COMMAND EXPANSION' man bash处理命令的步骤。

答案2

我最终使用该模块redirect_stdout将输出重定向到文件,然后sys.stdout.flush()在每个之后使用print()和 作为 shell 脚本COMMAND='./test.py run'。现在它正在实时传输输出。

相关内容