假设我必须构建一个 Scala 应用程序,如果指定的系统进程之一停止运行,它会提醒我。
有没有一种被动的方法来完成这个,而不是像 "pidof process_name"!
这样的东西每隔几秒运行一个无限循环(在 scala 中执行 shell 命令)?
如果 Scala/Java 不能做到这一点,我是否可以在中间加入一些东西来使它工作?我的 JNI
和 C
技能充其量只是生锈了,但如果那真的是唯一的方法,我会试一试。
有问题的操作系统是Centos 6.4
更新: 我发现了一个叫做“upstart”的东西,现在很多 linux 发行版(包括 Centos 6.4)都使用它来管理进程。根据this answer它可能能够满足我的需要,尽管没有提供很多信息。
最佳答案
几个标准选项:
您可以安排此脚本通过 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
这会按名称或正则表达式查找应用 - 相应地进行调整。
另一种选择是使用 fcntl Java 标准的文件锁定 library在 Linux 上使用。您锁定 pid 文件并在应用程序运行时保持锁定状态。可以从任何程序检查锁,无论是 C、Java 还是 shell 脚本 (lsof)。如果进程死了,操作系统会释放一个锁,所以你总是知道进程是死的还是活的。如果该进程是 fork 子进程的 C 程序,那么默认情况下它们不会继承锁。
我曾经在 Linux 上为协同工作的应用程序完成过该实现,它是在 Python、Perl、Java、C 和 shell 脚本中实现的。它用于避免启动同一应用的多个实例并用于监控。
使用像 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/