在我的框中,代码/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