![从 shell 脚本检测正在运行的进程时出现问题](https://linux22.com/image/191231/%E4%BB%8E%20shell%20%E8%84%9A%E6%9C%AC%E6%A3%80%E6%B5%8B%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
脚本:
#!/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
此处文档中的实用程序。