在代码中保存脚本变量并在重启后重置它们

Save a Script Variables inside code and reset them after reboot

在我的 vps 中我有 运行 4 Python 脚本并且我已经 60 天没有重启我的 vps 现在我必须这样做,但是如果我重新启动 vps 我的 python 变量和数据将被删除,因为我没有将它们存储在文件中,而是存储在 python 脚本中的变量中。 我的 OS 是 Ubuntu Server 16.04 LTS,我 运行 我的 python 代码使用 nohup 命令,直到它们可以 运行 在后台运行。 现在我需要一种方法来停止我的脚本而不删除它们的变量,并在我重新启动 vps 后使用相同的变量和数据启动它们。 有什么办法可以做到这一点? 另外,很抱歉我的问题写错了。

Python 没有提供任何方法。

但您可以使用 CRIU 或类似工具来冻结和快照解释器进程。然后,在重新启动后,您可以将快照恢复到一个新进程中,该进程恰好从您离开的地方开始。

它可能行不通。1 但它很有可能会行得通。这与 CRIU 文档中的 Live Migration 本质上是一样的,只是您不是迁移到新的 computer/container/etc,而是迁移到同一台计算机的未来。因此,从该页面开始阅读,然后点击那里的链接。

您可能应该在承诺之前进行测试。 * 在不做任何重要事情的 Python 脚本上尝试(显然不包括系统重启,只是 kill -9 可执行文件)(也许增加一个计数器,打印出来,休眠一段时间第二,重复。 * 也许可以在执行与您正在做的事情类似的事情的脚本上尝试。 * 如果同时拥有一个程序 运行 的两个副本是安全的(它们不会互相踩踏写入同一个文件,或争夺同一个套接字,或其他任何东西) ,开始第二个副本并测试 dump/kill/resume。 * 在您的真实进程之一上尝试它,仍然没有重新启动。 * 尝试所有四个。 * 双手合十,献祭一只鸡,当真。


如果这没有成功,我能想到的唯一选择是通过您的脚本,手动找出需要保存的所有内容以及如何从顶级全局访问它,以及在调试器中执行此操作。

理想情况下,您将编写一个脚本来自动访问和保存所有这些内容 — 加上另一个脚本以在重新启动时将其提供给新实例。然后你只是 pdb 现场口译员并开始倾倒一切。

这肯定是一项繁重的工作,而且没有多少乐趣。从好的方面来说,如果你做得对,它肯定会起作用。第三,很容易做错。


1.如果您依赖于打开的文件、管道、套接字等,CRIU 会尽您所能,这超出您最初的预期,但仍然不是您可能想要的一切……此外,如果您正在使用几乎所有的 RAM,很难将它们恢复到完全相同的状态。并且可能还有其他可能的问题。