【发布时间】:2012-09-17 13:24:29
【问题描述】:
我有一套小型 Java 应用程序,它们全部编译/打包为 <name-of-the-app>.jar 并在我的服务器上运行。偶尔其中一个会抛出异常,窒息而死。我正在尝试编写一个 quick-n-dirty Perl 脚本,该脚本将定期轮询以查看所有这些可执行 JAR 是否仍在运行,如果其中任何一个不在运行,请给我发送电子邮件并通知我哪个已死。
要手动确定这一点,我必须为要检查的每个应用程序运行 ps -aef | grep <name-of-app>。例如,要查看myapp.jar 是否作为进程运行,我运行ps -aef | grep myapp,并查找描述代表myapp.jar 的JVM 进程的grep 结果。这种手动检查现在变得乏味,是自动化的主要候选者!
我正在尝试实现检查进程是否正在运行的代码。我想让这个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 命令本身),我需要逻辑来说明如果 (# 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 并使用正确的应用名称调用它方面的任何帮助。提前致谢!
【问题讨论】:
-
Perl 可以做到这一点,但这是在重新发明轮子。有many sysadmin solutions 用于重启进程。
-
Re: grep 在进程表中匹配它的参数,通常的回避方法是
grep some[a]pp而不是grep someapp。此外,grep -c some[a]pp可以方便地为您提供匹配数。 -
补充一下@pilcrow 所说的,我过去做过的另一件事是
grep process_name | grep -v grep,以避免在其输出中包含grep 进程。