sh脚本中的ps命令不包括top命令

时间:2018-02-23 13:15:21

标签: bash

我编写了一个脚本来检查进程是否正在运行,它运行正常但在测试时,我发现它不包括在其他终端中运行的最高命令数

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时,它会给出两个计数。

1 个答案:

答案 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了解详情。
  • 我将您的计数变量重命名为更清晰。什么是“PROCESS_NUM”呢?对我来说听起来像是一个PID。
  • 引用所有变量。我不需要告诉你为什么,你有谷歌。

也就是说,如果您的系统上有可用的,您还应该考虑使用pgrep而不是任何类型的计数管道。尝试运行pgrep并查看操作系统告诉您的内容。