【问题标题】:NodeJs : maintain a script running for a given time?NodeJs:维护一个运行给定时间的脚本?
【发布时间】:2016-11-29 13:38:48
【问题描述】:

我快速而糟糕地编写了一个 Node.Js 脚本,没有任何类型的错误处理,它完成了这项工作,并最终在遇到错误时偶尔崩溃。粗心但高效。

为了让它继续运行,我可以永远使用 npm 并让它永远重启。花哨的。

现在假设我希望它运行 12 小时(使用一些模块/代码在崩溃后重新启动它)然后完全停止。

实现这种行为的任何简单方法?

【问题讨论】:

  • “粗心但高效”。这就是问题。我认为它是快速但无用的。
  • ;-) @Vohuman:我不同意。该脚本是仅供个人使用的业余机器人。当它崩溃时,它只会阻碍我,而不是太多。如果由 foreverJs 立即重新启动,崩溃根本不会影响其效率。我仍在开发它,并学习如何在此过程中正确使用 Node,将罕见的错误处理留到最后。此外,您可以删除介绍(仅供笑),问题仍然存在:-)

标签: javascript node.js forever


【解决方案1】:

如果您希望您的 node.js 进程在 12 小时后自行停止,您可以设置一个从现在开始 12 小时的计时器并调用 process.exit()

setTimeout(function() {
    process.exit(0);
}, 1000 * 60 * 60 * 12);

如果你想用forever这样的系统,但你又想在12小时内停止程序,又不想永远重启它,那么你可以运行一个chron job,计划在 12 小时后执行 forever stop /somepath/yourscript.js


附:一个经常自行崩溃的系统不可能是“粗心的,但有效的”。它可能很快就开始了,但它也是松散和危险的,从长远来看,它永远不是有效的编码方式。我建议您开始删除您在代码中添加的所有 technical debt

多年来,我在管理开发团队时最喜欢的一句话是一个有点反问的问题:“为什么没有足够的时间在第一次就把它做好,但总是有足够的时间把它重新做对。”

【讨论】:

  • 完整的答案,提供不同的解决方案和针对粗心的建议。谢谢。虽然如果我补充说:“我是一个业余学习 Node,最近了解了异步编程的工作原理,我在构建项目的同时不断改进以前的代码,而我生活中的主要问题是我从不做任何事情,因为我希望我所做的一切要完美”,你会继续为我说的话教训我吗? ;-) 这篇文章对我来说是一种治疗!干杯!
  • @KLôN - 好吧,当您阅读它时,您可以阅读有关Minimum Viable Product 的信息,但其中没有任何地方说您的代码应该设计不良并且充满错误。如果你只是在学习,那么你必须边做边学,但是学习的一个非常重要的部分是学习如何编写健壮、稳定的代码来处理错误情况。您不应该认为自动重启可以替代学习如何防止代码崩溃。
  • 我完全同意。老实说,我已经开始在绝对需要时处理错误,并且我计划使用我学到的知识来涵盖所有可能的结果。感谢您的时间和建议!
【解决方案2】:

如果您使用的是 UNIXy 操作系统,则可以使用 at 命令在给定时间永久终止。

例子:

$ echo 'forever stop whatever.js' | at now + 12 hours

【讨论】:

    【解决方案3】:

    您可以使用 Linux 的“at”命令设置相对计时器。 Forever 将在脚本崩溃时重新启动脚本。

    1. 开始你的脚本

      forever start /path/yourscript.js

    2. 调度停止命令

      echo 'forever stop /path/yourscript.js' | at now + 12 hours

    --

    请注意,您可能需要安装“at” - 例如。 (apt-get install at)

    请注意,您还可以安排“at”来执行 shell 脚本:

    • 创建一个包含以下行的文件“stopscript.sh”:forever stop /path/yourscript.js
    • 设置“at”作业:at now +12 hours -f ~/stopscript.sh

    【讨论】:

      【解决方案4】:

      使用cluster模块,master出错时重启集群。

      在 master 中,只需运行如下代码:

      setTimeout(function() {
          process.exit(0);
      }, 12 * 3600 * 1000);
      

      【讨论】:

      • 从现在开始的 12 小时内,您的数学计算有点偏离setTimeout()。你差了 1000 倍。
      猜你喜欢
      • 2016-01-19
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多