【问题标题】:Make python script write output in .txt file after force quit强制退出后使python脚本在.txt文件中写入输出
【发布时间】:2018-05-29 18:56:46
【问题描述】:

我有一个 Python 脚本通过 SSH 使用以下命令在服务器上运行:

nohup python3 python_script.py >> output.txt

它运行了很长时间并且(可能)创建了有用的输出,所以我想现在强制它停止。如何让它将目前的输出写入 output.txt 文件?

该文件是在我开始运行脚本时自动创建的,但大小为零(到目前为止还没有写入任何内容)。

【问题讨论】:

  • 如果您使用 python 日志记录来输出文本,那么它可能会输出到 STDERR。您只记录 STDOUT。你应该像这样运行它来捕获两者:nohup python3 python_script.py >> output.txt 2>&1 &
  • 感谢您的帮助。现在它自己完成了,并将所有内容都很好地写入了文件中。我只是不明白为什么它在运行时不偶尔将输出写入文件

标签: python ssh file-io


【解决方案1】:

正如罗伯特在他的评论中所说,检查您期望转到文件的输出是否实际上是在那里而不是标准错误。如果进程已经在运行并且已经很长时间没有任何响应或写入您的输出文件,我认为有 3 个选项:

  1. 它正在产生输出,但它没有达到您的预期(罗伯茨响应)
  2. 它正在生成输出,但它已被缓冲,并且由于某种原因尚未刷新
  3. 没有产生任何输出

选项 3 很简单:等待更长的时间。选项 1 和 2 有点棘手。如果您期望此过程有大量输出,您可以检查运行脚本的 python 实例的内存消耗,看看它是否在增长或非常大。您也可以使用lsof 来查看它是否打开了文件并了解它在做什么。

如果您发现您的输出看起来像是在 /dev/null 之类的地方,请查看 this 关于重定向现有进程的输出的答案。

万一您有一个尚未刷新的巨大缓冲区,您可以尝试使用 ps 获取 PID,然后使用 kill -STOP [PID] 暂停该进程并查看使用 GDB 可以获得的位置。

除非它会非常痛苦,否则我可能会重新启动整个过程,但会在脚本中添加定期刷新,也许还有一些额外的状态报告,这样你就可以知道发生了什么。如果您可以发布您的代码,这也可能会有所帮助,因为根据程序的编写方式,您的情况可能还有其他可用选项。

【讨论】:

  • 感谢您的帮助!绝对是第二个选项。该代码不直接引用任何文件。我唯一一次使用“>> output.txt”引用文件。所以你可以把脚本想象成一个巨大的 for 循环,每隔几分钟就会打印一些东西到标准输出。我不确定在这种情况下如何刷新文件?只有当我通过使用 f = fopen(...) 之类的东西来引用脚本中的文件时,我才知道该怎么做
  • Linux 会立即将任何 STDOUT 写入文件,但 python 可能会在它到达 STDOUT 之前将其保存在缓冲区中。 @SamuelBosch 如果您告诉我们您如何在 python 程序中记录/打印,那将会有所帮助。你应该看看 logging 模块,看看你是否可以使用它来记录到 STDERR,或者直接到文件。
  • 为简单起见,假设程序如下所示: for i in range(large_number): print(large_number) do_some_time_sumption_task() 当我运行这个程序时,它会输出 0,1,2, 3,...(在单独的行中),但是当我像上面那样运行它时,它会等到程序完成然后将整个输出写入 output.txt
  • @RobertSeaman 你是对的,这是很可能的情况。如果 python 正在使用行缓冲,并且您将 print() 替换为 write(),您将丢失 print 免费提供的换行符。一个 4k 缓冲区将在将它们交给操作系统之前保存相当数量的整数。 @SamuelBosch 如果您真的想要获取该缓冲区的内容,则需要等到它已满,或者(如果您使用的是 linux)您可以执行 ulimit -C unlimited 然后kill -3 <pid> 转储核心文件,然后尝试从中获取数据......这是很多工作,取决于你想要它有多糟糕:)
猜你喜欢
  • 2020-12-21
  • 2014-03-24
  • 1970-01-01
  • 2015-08-27
  • 2014-10-29
  • 2015-01-21
  • 2011-10-18
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多