我编写了一个脚本来检查进程是否正在运行,它运行正常但在测试时,我发现它不包括在其他终端中运行的最高命令数
check-process.sh
#!/bin/sh
OK=1
CRITICAL=0
PROCESS_NUM=$( ps -ef | grep $1 | grep -v "grep "|grep -v "sh"|wc -l )
#echo $PROCESS_NUM
if [ $PROCESS_NUM = $OK ]
then
echo "OK"
elif [ $PROCESS_NUM = $CRITICAL ]
then
echo "CRITICAL"
elif [ $PROCESS_NUM > $OK ]
then
echo "MULTIPLE process are runing"
else
echo "error"
fi
我在两个终端中运行 top命令并运行以下脚本:
./ check-process.sh top
和out put是 0 CRITICAL ,但是当我运行正常命令ps -ef |grep -v "grep "| wc -l
时,它会给出两个计数。
答案 0 :(得分:1)
grep
的混乱只是必须要去。
通过名称查找进程而不查找grep的一个“技巧”是使用正则表达式。毕竟,这就是Global Regular Expression Print命令的用途。您可以使用参数扩展根据输入字符串构造安全的正则表达式,可能是这样的:
#!/bin/sh
if [ -z "$1" ]; then
echo "I'd love me an option." >&2
exit 1
fi
OK=1
CRITICAL=0
x="${1#?}" # make a temporary string missing the 1st chararcter,
re="[${1%$x}]$x" # then place the 1st character within square brackets.
PROC_COUNT=$( ps -ef | grep -w -c "$re" ) # yay, just one pipe.
if [ "$PROC_COUNT" -eq "$OK" ]; then
echo "OK"
elif [ "$PROC_COUNT" -eq "$CRITICAL" ]; then
echo "CRITICAL"
elif [ "$PROC_COUNT" -gt "$OK" ]; then
echo "MULTIPLE process are running"
else
echo "error"
fi
这里有一些值得注意的变化:
$re
。-gt
和-eq
来测试数值。 man test
了解详情。也就是说,如果您的系统上有可用的,您还应该考虑使用pgrep
而不是任何类型的计数管道。尝试运行pgrep
并查看操作系统告诉您的内容。