从 shell 脚本检测正在运行的进程时出现问题

从 shell 脚本检测正在运行的进程时出现问题

脚本:

#!/bin/bash
kafka=`ps -ef | grep 'kafka' | grep -v grep | wc -l`
echo $kafka
if [ $kafka<3 ]
then
echo "Hi Support Team,

Kafka is down on QA/Dev server $hostname .Please take immediate action

Regards,
Application Support Team"| mailx -s "Kafka down on QA/Dev server" [email protected]
fi

输出:

-bash-4.2$ ./mail.sh
2
./mail.sh: line 4: 3: No such file or directory

答案1

不带引号的<运算符是 shell 中的重定向运算符。该错误表明 shell 尝试从名为 的文件重定向3。您很可能想用来-lt比较两个整数。

这是一个替代实现:

#!/bin/sh

if ! pkill -0 kafka; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

上面的脚本将用于pkill向每个进程发送“零信号” kafka(用于在整个命令行中pkill -0 -f kafka搜索子字符串kafka,而不仅仅是命令名称)。如果不存在这样的进程,这将导致pkill以非零退出状态退出,从而触发电子邮件的发送。 “零信号”用于测试进程是否存在,并且不会对进程产生任何影响。

或者,如果您想计算进程数kafka并在少于三个时触发电子邮件:

#!/bin/sh

if [ "$( pgrep kafka | wc -l )" -lt 3 ]; then
    mail -s 'Kafka down on QA/Dev server' [email protected] <<END
Hi Support Team,

Kafka is down on QA/Dev server $hostname.
Please take immediate action

Regards,
Application Support Team
END
fi

pgrep调用输出与给定模式匹配的所有进程名称的进程 ID,每行一个。用于pgrep -f kafka搜索kafka整个命令行中的子字符串,而不仅仅是命令名称。

上面的两个脚本都假设变量hostname已在脚本外部设置并导出。您可以使用$(hostname)$hostname调用hostname此处文档中的实用程序。

相关内容