使用pgrep避免循环中的多个实例

时间:2019-03-26 13:27:08

标签: bash shell loops grep pid

我正在使用以下脚本(非常简化)来检查是否出现某些情况以显示用户界面。脚本在基于BusyBox的Linux发行版上运行非常有限,因此请记住,没有诸如upstart / systemd之类的工具或用于管理基于事件的脚本启动的任何其他工具:

#!/bin/sh

while true; do
    if ./check-condition && pgrep -f ./start-ui; then
        ./start-ui &
    fi
done

这里的问题是,在某些情况下,pgrep在后​​台进程设置其名称之前被调用,因此./start-ui进程的多个实例将在运行。

可以使用以下代码来模拟问题,有时cat /proc/$!/cmdline的输出是bash / sh,而不是/bin/sleep

for _ in `seq 1 100`; do pkill sleep; exec /bin/sleep 3 & cat /proc/$!/cmdline; echo; done

我想知道是否有一种方法可以在给定的情况下正确使用pgrep? 我想避免执行后台进程后的sleep,因为它们会影响整个系统的响应速度。我也想避免使用PID文件,因为它们不能独立于此脚本来处理./start-ui的启动,也是这种情况。

0 个答案:

没有答案