java - 斯卡拉/Java/Linux : is it possible to monitor a system process passively?

标签 java linux scala process centos

假设我必须构建一个 Scala 应用程序,如果指定的系统进程之一停止运行,它会提醒我。

有没有一种被动的方法来完成这个,而不是像 "pidof process_name"! 这样的东西每隔几秒运行一个无限循环(在 scala 中执行 shell 命令)?

如果 Scala/Java 不能做到这一点,我是否可以在中间加入一些东西来使它工作?我的 JNIC 技能充其量只是生锈了,但如果那真的是唯一的方法,我会试一试。

有问题的操作系统是Centos 6.4

更新: 我发现了一个叫做“upstart”的东西,现在很多 linux 发行版(包括 Centos 6.4)都使用它来管理进程。根据this answer它可能能够满足我的需要,尽管没有提供很多信息。

最佳答案

几个标准选项:

  1. 您可以安排此脚本通过 crontab 每 5 分钟运行一次,例如:

    */5 * * * * /install_dir/app_monitor.sh
    

    脚本本身app_monitor.sh:

    #!/bin/bash
    
    # Application name
    appName="jar"
    
    # find all app instances
    procCount=$(ps -ef | grep "$appName" | egrep -v grep | wc -l)
    if [ "$procCount" -eq 0 ]; then
      echo "No applications running."
      mutt -e 'my_hdr From:admin@dreamapp.com' -s "Your app just died yo, time: $(date)." your@email.com -c yourhome@email.com < "More useful info or log file here"
      # or use sendmail, or any other notification option
      exit 1
    else
      echo "Something is running."
    fi
    

    这会按名称或正则表达式查找应用 - 相应地进行调整。

  2. 另一种选择是使用 fcntl Java 标准的文件锁定 library在 Linux 上使用。您锁定 pid 文件并在应用程序运行时保持锁定状态。可以从任何程序检查锁,无论是 C、Java 还是 shell 脚本 (lsof)。如果进程死了,操作系统会释放一个锁,所以你总是知道进程是死的还是活的。如果该进程是 fork 子进程的 C 程序,那么默认情况下它们不会继承锁。

    我曾经在 Linux 上为协同工作的应用程序完成过该实现,它是在 Python、Perl、Java、C 和 shell 脚本中实现的。它用于避免启动同一应用的多个实例并用于监控。

  3. 使用像 nagios 这样的现成工具:http://www.nagios.com/solutions/linux-process-monitoring/

关于java - 斯卡拉/Java/Linux : is it possible to monitor a system process passively?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21993218/

相关文章:

java - 不能是@Required 或@NotNull

php - Windows telnet 给出不同的结果

linux - Django 服务器从 Mac 到 Linux 的本地端口转发

scala - 简单的 Shapeless HLIST 上的模式匹配

scala - trait 中的覆盖函数

java - 属性动画的端监听器

java - STRIKE_THRU_TEXT_FLAG 未按预期工作

java - Swing,多次运行重复使用一个 "screen"

linux - SCP 不在 crontab 中工作,但在命令行上工作

java - 在 Java 中使用 Scala 类型(类型不匹配)