匹配节目名,为什么点击率这么高?

匹配节目名,为什么点击率这么高?

在我的框中,代码/bin/ps -aux | /bin/grep -c "blynk"返回 1,因为 blynk 服务器未运行。

但是,当在 bash 文件中运行相同的代码时,它会返回 4。这是怎么发生的?

#!/bin/sh
stat=`/bin/ps -aux | /bin/grep -c "blynk"`
if [ $stat -lt "2" ]; then
    echo not running
else 
    echo running
    date
fi

答案1

你必须防止grep发现它自己。一个简单的方法是:

/bin/ps -aux | /bin/grep -c "[b]lynk"

这种方式可以在命令行中不包含它的情况下grep进行搜索。blynk或者你阻止grep同时运行:

/bin/ps -aux >ps.txt
/bin/grep -c "[b]lynk" ps.txt

当然,根本不使用 grep 命令行是有意义的,因为您还会找到使用 file 打开的编辑器README.blynk

因此,最好使用pgrep或修改ps输出,将其限制为命令名称或命令路径。

答案2

您会得到更高的数字,grep因为有更多程序正在运行与该模式匹配。

grep如果您查看(不带)的输出-c,您将看到 match 的输出中的哪些行ps。例如,如果我制作这样的脚本,我会得到三个:

$ cat check_blynk.sh
#!/bin/bash
foo=$(/bin/ps a | /bin/grep "blynk")
echo "$foo"

$ bash check_blynk.sh
28874 pts/11   S+     0:00 bash check_blynk.sh
28875 pts/11   S+     0:00 bash check_blynk.sh
28877 pts/11   S+     0:00 /bin/grep blynk

这是 的一个grep,因为它使用的模式与自身相匹配,而脚本的一个恰好在其名称中包含相同的单词,并且其他事实上,它ps | grep正在子 shell 中运行,即 shell 的另一个副本。 (我不确定第四个是什么。)

您可能想使用类似的东西pgrep -c blynk,假设blynk是程序文件的名称。pgrep默认情况下检查正在运行的程序的实际文件名,而不是整个命令行。 (用-f它检查命令行,但您将再次匹配 Bash 脚本)

答案3

bash检查命令进程是否正在运行的函数,排除已失效(僵尸、死亡)的情况:

_isRunning() {
    ps -o comm= -C "$1" 2>/dev/null | grep -x "$1" >/dev/null 2>&1
}

笔记: ps也报告失效的进程,因此grep -x使用

用法示例:

if _isRunning blynk; then
  echo not running
else 
  echo running
  date
fi

相关内容