【问题标题】:Checking if java code is running and attempt to restart if not (unix)检查java代码是否正在运行,如果没有则尝试重新启动(unix)
【发布时间】:2014-02-28 10:51:31
【问题描述】:

我有一些 java 代码在树莓派(从终端)上连续运行,并监听 twitter 流并将数据保存到磁盘/usb。

我想知道检测程序是否仍在运行以便采取适当措施并尝试重新启动应用程序的首选方法是什么?

我希望通过这种方式我可以检测到程序失败,发送电子邮件通知我并尝试重新运行代码。在服务器环境中运行它是最好的方法吗?

【问题讨论】:

  • 这取决于你的操作系统使用什么初始化系统;那是经典的 SysV 吗?还有什么?
  • 请原谅,我对初始化系统不了解,也不了解它们之间的区别。我正在使用 Raspbian,经过一番研究,我认为它确实是 SysV,比如 Debian
  • 如果是这样,那么您首先需要编写一个SysV init脚本;您至少需要实现startstopstatus 命令
  • 您可以使用来自smarden.org/runit 的 runit -- google 说它已经打包在 raspbian 中,并且它完全按照您说的做(要发送电子邮件,您需要在与“运行”脚本相同的目录,请参阅 runsv 手册页或谷歌一些示例)

标签: java unix


【解决方案1】:

看看forever 项目。如果您安装了npm,您可以使用它来安装带有-g(用于全局安装)参数的forever 包:

npm install forever -g

然后使用 start 参数启动脚本。在您的情况下,这可能是一个带有所需 java 命令的 bash 文件 (.sh)。

 forever start name-of-script-here

如果脚本失败(java 中的 system.exit 或任何致命错误),它将永远重新启动。您还可以通过以下方式获取由 forever 管理的所有正在运行的脚本的列表:

  forever list

【讨论】:

  • 我知道,这不是很好笑吗?现在克服它并再次/完全阅读我的答案。 (编辑:永远可以管理 bash 脚本,因此您可以完美地使用它来管理包含 java 命令的脚本,此信息已经在原始答案中)
  • 我确实读过它;我没有看到相关性,抱歉。既然 Unix 已经有所有的机制来处理它,你为什么还要费心安装 npm?
  • 在我看来,永远让这项工作变得更容易。更易于配置和更易于管理。我同意 linux 可以开箱即用。
  • 这是有用的信息,绝对是一种强大的方法,但是,理想情况下,我希望在没有任何外部工具的情况下执行此操作。谢谢
【解决方案2】:

在 Unix 中,让父进程创建子 java 进程并让它监控。如果它终止,则父级可以重新启动它。

Unix fork 将子 pid 返回给父。

使用这种技术:Tracking the death of a child process 父母可以监控孩子的死亡情况。

【讨论】:

  • 从概念上讲,这是我一直在寻找的那种东西,关于在 java 中哪里可以找到这样的例子的任何指针?我主要是 C 编码员,所以将 java run 命令放入脚本并将其放入进程中可能会更快。
  • 你可以在用 C 编写的父进程中从 exec() 调用 java 可执行文件
  • 这对我来说可能是最简单的方法,尽管我有一种邪恶的倾向,这让我想以艰难的方式尝试它并在我完全陌生的 java 中进行。
猜你喜欢
  • 1970-01-01
  • 2018-04-25
  • 2018-05-11
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多