From 79c4b61f2283b699978ee74df79eddd1ca289acf Mon Sep 17 00:00:00 2001 From: don bright Date: Sat, 16 Feb 2013 15:38:11 +0100 Subject: [PATCH] deal with some unusual systems where $! doesn't work as expected --- tests/virtualfb.sh | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/tests/virtualfb.sh b/tests/virtualfb.sh index 5abd804d..06d37bf4 100755 --- a/tests/virtualfb.sh +++ b/tests/virtualfb.sh @@ -3,6 +3,8 @@ # Toggle the Virtual Framebuffer # If started, stop. If stopped, start. +debug= + start() { if [ "`command -v Xvfb`" ]; then @@ -20,7 +22,20 @@ start() VFB_DISPLAY=`echo | awk 'BEGIN{srand();} {printf ":%.0f", rand()*1000+100};'` $VFB_BINARY $VFB_DISPLAY -screen 0 800x600x24 &> ./virtualfb.log & - VFB_PID=$! + # on some systems $! gives us VFB_BINARY's PID, on others we have to subtract 1 + VFB_PID_MINUS0=$! + VFB_PID_MINUS1=$(($VFB_PID_MINUS0 - 1)) + + if [ "`ps cax | grep $VFB_PID_MINUS0 | grep $VFB_BINARY`" ]; then + VFB_PID=$VFB_PID_MINUS0 + elif [ "`ps cax | grep $VFB_PID_MINUS1 | grep $VFB_BINARY`" ]; then + VFB_PID=$VFB_PID_MINUS1 + else + echo started $VFB_BINARY but cannot find process ID in process table + echo please stop $VFB_BINARY manually + VFB_PID= + return + fi echo $VFB_DISPLAY > ./virtualfb.DISPLAY echo $VFB_PID > ./virtualfb.PID @@ -48,13 +63,29 @@ isrunning() { isrunning_result= if [ -e ./virtualfb.PID ]; then + if [ $debug ]; then echo "found PID file"; fi VFB_PID=`cat ./virtualfb.PID` + if [ ! $VFB_PID ]; then + echo ./virtualfb.PID contained invalid PID number + return + fi + if [ $debug ]; then echo "PID from file:" $VFB_PID; fi + PS_RESULT=`ps cax | awk ' { print $1 } '` + GREP_RESULT=`echo $PS_RESULT | grep $VFB_PID` + if [ $debug ]; then echo "grep ps result: " $GREP_RESULT; fi if [ "`ps cax | awk ' { print $1 } ' | grep ^$VFB_PID\$`" ]; then + if [ $debug ]; then echo "found pid in process table."; fi isrunning_result=1 + else + if [ $debug ]; then echo "did not find pid in process table."; fi fi fi } +if [ "`echo $* | grep debug`" ]; then + debug=1 +fi + isrunning if [ $isrunning_result ]; then stop