我需要能够暂停“正在运行的脚本”,让操作系统将其状态保存到磁盘,然后通过读取该状态并准确地从它离开的位置继续来恢复它。该系统是一个12核计算节点,共享内存为48GB,运行linux。我没有管理员权限,我使用 ssh 远程登录。脚本和其中的可执行文件不使用 GUI,它都是命令行,据我所知,不需要明确的网络或套接字。
“运行脚本”(或“管道”)是指 bash 脚本或 perl 脚本或两者的组合,它们会产生一些 C/C++ 可执行文件,可能它们正在使用 openmp 并行化。或者使用 gnu-parallel 生成并行可执行文件。因此,我们不是在谈论单个可执行文件,而是一系列并行或按顺序运行的可执行文件,使用隐式并行化超过 12 个内核和公共内存,并由几个 unix 命令(例如 awk)粘合。
我需要暂停并重新启动管道,因为调度程序(MOAB)会杀死(系统规则)所有运行时间超过 24 小时的作业。这个想法是暂停工作并重新排队。这种技术是完全合法的。
修改可执行文件的源代码以便它们都保存状态并稍后恢复它是不切实际的,因为这意味着修改几个开源可执行文件以接受“保存状态和暂停”信号,比如 ImageMagick 的“转换”或甚至是 'grep'、'sed'、'awk' 和 perl !另外,还有一个可执行文件是闭源的,没有源代码。
所以,我相信我处于一种(唯一的?)实用选择是在所谓的沙箱环境中运行我的“脚本/管道”的情况,例如 QEMU(一个模拟器),希望可以发送一个信号要“休眠”,只需将整个内存和 cpu 状态保存到磁盘(48GB 不是问题)并挂起,即可保存其中所有当前正在运行的程序的状态。
我不是上述任何方面的专家,所以请原谅我的术语,或者如果我说了什么无效的话。我只是素描。
回顾一下:我正在向任何有经验的人询问在 linux 下暂停和重新启动复杂脚本作业的解决方案,而无需将代码修改为“保存状态”。该解决方案还应该具有相对计算效率,即最终不会浪费大量超级计算机的能力来运行仿真器。
如果您认为我上面谈到的 QEMU 解决方案是可以的,那么请,如果可以,请举一些例子说明如何开始,即从公共 ISO 创建一个模拟器 linux 映像,加载映像,运行“脚本”,告诉模拟器在 20 小时后“暂停/休眠”,然后通过从暂停状态读取它的状态来恢复模拟器。所有这一切,最好是从命令行或通过脚本。
欢迎任何其他解决方案,只要它们是实用的(对于给定的设置)。
请注意:我没有管理员权限,但可以在我的 homedir 中安装东西并且有很多硬盘空间。此外,这些程序不使用 GUI,它都是命令行,据我所知,不需要明确的网络或套接字。
作为带有模拟器的解决方案的积极副作用,任何这样的“管道”都可以分发到实施“沙盒”/模拟器的任何操作系统(例如 mac 或 win),而无需重新编译所有内容的复杂过程并安装 gnu-utils、bash、boost 等。我发现自己多次遇到这种情况。
谢谢你的帮助,bliako。