我有一套小型Java应用程序,所有应用都编译/打包成<name-of-the-app>.jar
并运行在我的服务器上。偶尔其中一个会抛出异常,卡住并停止运行。我正在尝试编写一个快速而简单的Perl脚本,定期轮询以查看这些可执行JAR文件是否仍在运行,如果有任何一个没有运行,则会发送电子邮件通知我哪个已停止。
要手动确定这一点,我必须为每个要检查的应用运行ps -aef | grep <name-of-app>
命令。例如,要查看myapp.jar
是否作为进程运行,我运行ps -aef | grep myapp
,然后查找描述表示myapp.jar
的JVM进程的grep结果。这种手动检查现在变得乏味,是自动化的主要候选项!
我正试图实现检查进程是否正在运行的代码。我想将其作为一个sub
来实现,该sub
接受可执行JAR的名称并返回true
或false
:
sub isAppStillRunning($appName) {
# Somehow run "ps -aef | grep $appName"
# Somehow count the number of processes returned by the grep
# Since grep always returns itself, determine if (count - 1) == 1.
# If so, return true, otherwise, false.
}
我需要能够传递应用程序的名称给
sub
,运行我的正常命令,并计算grep
返回的结果数。由于运行grep
总是至少有一个结果(grep
命令本身),我需要一种逻辑来判断如果(结果数-1)等于1,则我们知道该应用正在运行。我刚开始学习Perl,很难弄清楚如何实现这个逻辑。以下是到目前为止我最好的尝试:
sub isAppStillRunning($appName) {
# Somehow run "ps -aef | grep $appName"
@grepResults = `ps -aef | grep $appName`;
# Somehow count the number of processes returned by the grep
$grepResultCount = length(@grepResults);
# Since grep always returns itself, determine if (count - 1) == 1.
# If so, return true, otherwise, false.
if(($grepResultCount - 1) == 1)
true
else
false
}
然后要调用该方法,从同一个Perl脚本内部,我认为只需运行:
&isAppStillRunning("myapp");
非常感谢您对定义子应用程序并使用正确的应用程序名称进行调用的任何帮助。 提前致谢!
grep some[a]pp
而不是grep someapp
。此外,grep -c some[a]pp
将可移植地给出匹配的计数。 - pilcrowgrep process_name | grep -v grep
的操作,以避免在输出中获取到grep进程。 - laaph