170

我正在使用以下命令在后台运行 python 脚本:

nohup ./cmd.py > cmd.log &

但似乎 nohup 没有向日志文件写入任何内容。cmd.log 已创建,但始终为空。在 python 脚本中,我使用sys.stdout.write而不是print打印到标准输出。我做错什么了吗?

4

7 回答 7

466

您可以使用该标志运行 Python-u以避免输出缓冲:

nohup python -u ./cmd.py > cmd.log &
于 2012-10-16T17:19:17.527 回答
110

看起来您需要定期刷新标准输出(例如sys.stdout.flush())。print在我的测试中,即使程序退出,Python 也不会自动执行此操作。

于 2012-10-16T17:17:11.660 回答
63
  • 使用-u withnohup对我有用。使用-u将强制stdout,stderr流无缓冲。它不会影响标准输入。一切都将保存在“ nohup.out ”文件中。像这样-

    nohup python -u your_code.py &
    

    您也可以将其保存到您的目录中。这边走-

    nohup python -u your_code.py > your_directory/nohup.out &
    
  • 此外,您可以使用PYTHONUNBUFFERED. 如果将其设置为非空字符串,它将与-u选项相同。在运行 python 代码之前使用下面的命令运行。

    export PYTHONUNBUFFERED=1
    

    或者

    export PYTHONUNBUFFERED=TRUE
    

PS- 我会建议使用像 cron-job 这样的工具在后台运行和计划执行。

于 2017-07-27T15:59:10.887 回答
20
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &

或者

nohup python -u ./cmd.py > cmd.log &

https://docs.python.org/2/using/cmdline.html#cmdoption-u

于 2017-04-09T07:21:37.120 回答
3

Python 3.3 及更高版本有一个 print 参数,这是唯一对我有用的方法。

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
于 2018-05-24T03:09:07.367 回答
0

我有一个类似的问题,但与 Python 进程无关。我正在运行一个执行 nohup 的脚本,该脚本通过 cron 定期运行。

我能够通过以下方式解决问题:

  1. 重定向标准输入、标准输出和标准错误
  2. 确保通过 nohup 调用的脚本没有在后台运行任何其他内容

PS:我的脚本是用在 RHEL 上运行的 ksh 编写的

于 2018-06-06T09:58:15.907 回答
-2

我以以下方式运行我的脚本,我完全没有问题:

nohup python my_script.py &> my_script.out &

与您的语法相比,您输入后似乎只缺少一个“&”符号......

于 2021-02-08T12:03:23.860 回答