Scala / Java / Linux:是否有可能被动地监视系统进程?

时间:2014-02-24 16:22:37

标签: java linux scala process centos

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

是否有一种被动方式来实现这一点,而不是像"pidof process_name" !那样每隔几秒运行一次无限循环(在scala中执行shell命令)?

如果Scala / Java不具备此功能,那么我可以在中间使用这些功能吗?我的JNIC技能充其量是生锈的,但如果真的是唯一的方法,我会试一试。

有问题的操作系统是Centos 6.4

更新:我发现了一些叫做“暴发户”的东西,现在很多Linux发行版(包括Centos 6.4)都在使用它来管理流程。根据{{​​3}}它可能能够满足我的需要,尽管没有给出很多信息。

2 个答案:

答案 0 :(得分:1)

结合标准选项:

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

    */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)。如果进程死亡,操作系统将释放锁定,因此您始终可以知道该进程是死还是活。如果该进程是一个伪造子进程的C程序,那么默认情况下它们不会继承该锁。

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

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

答案 1 :(得分:0)

您可以创建一个启动流程的包装器脚本,然后只需等待其终止。您应该能够在Bash或Scala(或其他shell)中编写包装器脚本。终止后,包装器可以使用Scala监控应用程序注册事件。