检查程序是否在 Linux 上运行

检查程序是否在 Linux 上运行

我正在尝试检查 Linux 服务器上的某个程序是否正在运行,如果没有,则启动它。但我收到奇怪的错误:

#!/bin/sh
SERVICE=nrpe

ps -ef | grep -v grep | grep $SERVICE | wc -l

if [ $? -gt 1 ]
then
    echo "$?"
    echo "$SERVICE service running, everything is fine"
else
    echo "$?"
    echo "$SERVICE is not running"
    service $SERVICE start
fi

输出为:

[root@mail ~]# check_nrpe.sh 2 1 nrpe 未运行 启动 Nagios NRPE 守护进程(nrpe):

无论 nrpe 是否正在运行,消息都是相同的。如果我ps -ef | grep -v grep | grep $SERVICE | wc -l在 shell 中测试该命令,它会起作用。

答案1

首先,为了使您的脚本按预期工作,请将“if 语句”更改为:

if [ $? -eq 0 ]

此外,xinetd 有可能正在管理你的 nrpe(这很常见),在这种情况下,你不会看到 nrpe 进程正在运行,而是看到 xinetd 进程。

所以我认为更好的检查是看看端口是否打开,我建议你将命令更改ps -ef...为(假设 nrpe 以默认方式配置并打开 tcp 端口 5666):

netstat -plunt | grep -w 5666

退出状态将按照您的预期运行,如果端口打开则为“0”,如果端口关闭则为“非 0”。

另外,你可以将整个脚本写成一行:

netstat -plunt | grep -qw 5666 && echo "NRPE is running" || echo "NRPE is not running"

例子:

[root@centolel tmp]# netstat -plunt | grep -qw 5666 && echo "NRPE is running" || echo "NRPE is not running"
NRPE is running
[root@centolel tmp]# service xinetd stop
Stopping xinetd:                                           [  OK  ]
[root@centolel tmp]# netstat -plunt | grep -qw 5666 && echo "NRPE is running" || echo "NRPE is not running"
NRPE is not running

相关内容