我正在编写一个脚本(show_volume.sh),可以在短时间内多次调用。我需要一种方法来确定是否只有一个运行此脚本的实例。我想我可以使用ps
,所以我在Bash中编写了这个函数:
is_only_process(){
PCOUNT=`ps -a | grep show_volume.sh | wc -l`
echo $PCOUNT
if (( PCOUNT==1 )); then
return 1
fi
return 0
}
所以我添加了这两行
is_only_process
sleep 4
并启动此脚本一次,但echo $PCOUNT
的输出对我没有任何意义。我总是按预期得到值2而不是1。当我运行此命令时
ps -a | grep show_volume.sh | wc -l
,我收到值1。 当我连续几次运行这个脚本时,它几乎是一样的,例如使用for循环10次。当我在使用另一个终端时收到正确的值时,脚本本身会确定太高的值。
现在,为什么这个脚本会确定这些奇数值?
答案 0 :(得分:6)
当ps
运行时,进程grep show_volume.sh
也在运行,所以你总是算上grep!
简单解决方案,grep s[h]ow_volume.sh
。 grep(不是shell)会将[h]
折叠为h
并搜索您想要的内容,但是您的grep将不匹配,因为它将在参数中包含[]。
pgrep
对此任务也很有用,并且足够智能,可以始终排除自身。
答案 1 :(得分:1)
尝试排除grep,因为你的grep本身也包含show_volume.sh
,一个例子
ps -a | grep show_volume.sh | grep -v grep | wc -l
答案 2 :(得分:1)
如果您以不同的用户身份运行脚本,则ps -a
将仅显示当前用户的实例,并且仅显示具有附加终端的实例。使用ps -ax
或ps -e
。
pgrep -c
将显示计数而无需使用wc
。
答案 3 :(得分:0)
ajreal提供的解决方案:
ps -a | grep show_volume.sh | grep -v grep | wc -l </ p>
应该有效。如果没有,请提供
的输出ps -a | grep show_volume.sh | grep -v grep
这里