假设我必须构建一个Scala应用程序,如果其中一个指定的系统进程停止运行,它将提醒我。
是否有一种被动方式来实现这一点,而不是像"pidof process_name" !
那样每隔几秒运行一次无限循环(在scala中执行shell命令)?
如果Scala / Java不具备此功能,那么我可以在中间使用这些功能吗?我的JNI
和C
技能充其量是生锈的,但如果真的是唯一的方法,我会试一试。
有问题的操作系统是Centos 6.4
更新:我发现了一些叫做“暴发户”的东西,现在很多Linux发行版(包括Centos 6.4)都在使用它来管理流程。根据{{3}}它可能能够满足我的需要,尽管没有给出很多信息。
答案 0 :(得分: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
按名称或正则表达式查找应用程序 - 相应调整。
另一种选择是使用fcntl文件锁定,这是Java标准library在Linux上使用的。锁定pid文件并在应用程序运行时将其锁定。可以从任何程序检查锁,无论是C,Java还是shell脚本(lsof)。如果进程死亡,操作系统将释放锁定,因此您始终可以知道该进程是死还是活。如果该进程是一个伪造子进程的C程序,那么默认情况下它们不会继承该锁。
我曾经在Linux上为那些协同工作的应用程序完成了这个实现,它是用Python,Perl,Java,C和shell脚本实现的。它用于避免启动同一应用程序的多个实例并进行监控。
使用现成的工具,如nagios:http://www.nagios.com/solutions/linux-process-monitoring/
答案 1 :(得分:0)
您可以创建一个启动流程的包装器脚本,然后只需等待其终止。您应该能够在Bash或Scala(或其他shell)中编写包装器脚本。终止后,包装器可以使用Scala监控应用程序注册事件。