我正在EC2 spot实例上运行一些应用程序。这样的实例可能会被亚马逊在没有通知的情况下杀死。
在关机过程中,进程会按某种顺序终止。我们有监控/恢复程序,它们应该根据服务器是关闭还是进程刚刚崩溃而采取不同的行为。(具体地说,如果服务器实际上正在关闭,我们不想做任何事情)
如何在恢复过程中检测到进程(如果它仍然活着)是由于关闭而被终止的?
(更多系统细节:我在一个不修改外部状态的沙箱中运行未知/不受信任/etc代码。通常,如果沙箱代码崩溃,这是不可信代码的作者的错误,我们不会重新运行它。但是,如果沙箱代码由于VM关闭或失败而终止,我们需要在另一个实例上重新运行它。我现在遇到的问题是,用户的代码首先被终止,因此监控程序错误地认为崩溃是用户错误。)
发布于 2012-06-02 15:42:23
代理
在生成沙箱子进程的每台计算机上运行一个代理。代理运行“防崩溃”的代码,沙箱代码运行可能崩溃的用户代码。
负责使用新沙箱进程启动新机器的监视系统检查哪些进程已被终止(代理和沙箱进程或仅沙箱子进程)。
它通过打开到代理的TCP连接(RMI/RPC/HTTP)来查询其子进程。如果代理响应-计算机仍在运行,则可以询问其子沙箱进程。如果代理没有响应,则机器可能已终止。
代理(变体)
代理还负责在同一个VM上重新启动子沙箱进程,以防它崩溃。
查找服务
使用查找服务(如Zoo Keeper)跟踪发送心跳保持活动的进程。如果代理是活动的,则计算机仍在运行;如果代理不是活动的,则它没有运行。
ec2接口
轮询EC2 API以确定机器是处于运行状态还是已终止状态。
发布于 2012-05-31 08:30:44
您的恢复过程是如何工作的?
如果您使用waitpid监视进程,则可以确定它何时退出:
根据进程的关闭方式,我希望看到它要么正常退出,要么通过SIGTERM或SIGKILL退出。SIGILL、SIGABRT、SIGFPE、SIGBUS、SIGSEGV和SIGSYS将表示由于编程错误而崩溃。
发布于 2012-05-22 07:25:18
这听起来像是一个非常脆弱的计划。不要试图检测系统的状态:让您的应用程序写出一个有效性令牌(并同步相关文件!)不知何故,在应用程序的“干净”关闭/停止/停止之后,并使用它。
https://stackoverflow.com/questions/10693769
复制相似问题