如何从ruby执行和管理ruby脚本?

时间:2013-03-19 17:45:42

标签: ruby execute health-monitoring

我有一个名为program.rb的脚本,并希望编写一个名为main.rb的脚本来执行以下操作:

system("ruby", "program.rb")

constantly check if program.rb is running until it is done
if program.rb has reached completion
    exit main.rb
end
otherwise keep doing this until program.rb reaches completion{
if program.rb is not running and stopped before completing
    restart program.rb from where it left off
end}

我看过Pidify但是找不到一种方法来应用它来完全适合这种方式...... 任何有关如何处理此脚本的帮助将不胜感激!

更新: 如果在main.rb中无法做到这一点,我可以弄清楚如何在program.rb中从中断处继续运行脚本

2 个答案:

答案 0 :(得分:1)

如果没有program.rb的全面合作,就不可能“从中断的地方重新启动脚本”。也就是说,它应该能够通告其进度(通过将当前状态写入文件,可能?)并且能够从ARGV中指定的步骤正确启动。没有外部红宝石魔法可以取代这个功能。

此外,如果程序异常终止,则表示以下两种情况之一:

  • 错误是(半)永久性的(磁盘已满,对文件没有适当的访问权限等)。在这种情况下,只需重新启动程序就会导致程序再次失败。然后再次。无限失败循环。
  • 错误是暂时的(互联网连接不稳定)。在这种情况下,程序应该在异常处理和自己重试(而不是终止)时做得更好。

在任何一种情况下,都不需要重启,恕我直言。

答案 1 :(得分:1)

嗯,这是一种方式。

修改program.rb以获取可选的标志参数--restart或其他内容。

program.rb在没有此参数的情况下启动时,它将初始化文件以记录其当前状态。它会定期将所需内容写入此文件以记录某种检查点。

program.rb使用重新启动标志启动时,它将读取其检查点文件并在此时开始处理。为了使其工作,它必须检查所有状态变化或安排检查点之间的所有处理是幂等的,以便它可以重复而不会产生不良影响。

有很多方法可以监控program.rb的健康状况。最好的方法是使用某种类型的ping,可能是GET /health_check或通过套接字或管道的虚拟消息。您可以只有一个锁定的文件来检测锁是否仍然存在,或者您可以在启动时记录PID并检查它是否仍然存在。