我正在使用以下脚本(非常简化)来检查是否出现某些情况以显示用户界面。脚本在基于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
的启动,也是这种情况。