我有一套小型 Java 应用程序,它们都编译/打包到<name-of-the-app>.jar
我的服务器上并在我的服务器上运行。偶尔其中一个会抛出异常,窒息而死。我正在尝试编写一个 quick-n-dirty Perl 脚本,该脚本将定期轮询以查看所有这些可执行 JAR 是否仍在运行,如果其中任何一个不在运行,请给我发送电子邮件并通知我哪个已死。
要手动确定这一点,我必须为ps -aef | grep <name-of-app>
要检查的每个应用程序运行一个。例如,要查看是否myapp.jar
作为进程运行,我运行ps -aef | grep myapp
并查找描述代表 的 JVM 进程的 grep 结果myapp.jar
。这种手动检查现在变得乏味,是自动化的主要候选者!
我正在尝试实现检查进程是否正在运行的代码。我想让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
. 由于运行 agrep
始终会产生至少一个结果(grep
命令本身),因此我需要说明如果 (# of results - 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");
非常感谢任何有关定义 sub 然后使用正确的应用程序名称调用它的帮助。提前致谢!