grml-screen: do not get confused by externally created pidfiles
authorMichael Gebetsroither <michael@mgeb.org>
Sat, 6 Nov 2010 19:17:12 +0000 (20:17 +0100)
committerMichael Gebetsroither <michael@mgeb.org>
Mon, 8 Nov 2010 13:43:20 +0000 (14:43 +0100)
usr_bin/grml-screen

index 7deeb77..73bdea9 100755 (executable)
 
 # FIXME: fix for screen race-conditions
 PID_FILE_="/var/run/grml-screen"
+PID_FILE_CREATED_="false"
 MY_PID_="$$"
 if [ ! -d "/var/run/screen/S-$USER" ]; then
     # no /var/run/screen/S-$USER and possible no /var/run/screen either -> locking
     for i in `seq 40`; do   # 40*0.25 = 10 seconds
         if lockfile-create --retry 0 $PID_FILE_; then
             echo $MY_PID_ >$PID_FILE_
+            PID_FILE_CREATED_="true"
             break
         fi
         sleep 0.25
     done
 fi
-if [ -f $PID_FILE_ ]; then
-    # FORK BEGIN
-    (
-    for i in `seq 40`; do   # 40*0.25 = 10 seconds
-        if [ ! -d "/var/run/screen/S-$USER" ]; then
-            sleep 0.25  # educated guess
-        else
-            break
+if [ $PID_FILE_CREATED_ = "true" ]; then
+    if [ -f $PID_FILE_ ]; then
+        # FORK BEGIN
+        (
+        for i in `seq 40`; do   # 40*0.25 = 10 seconds
+            if [ ! -d "/var/run/screen/S-$USER" ]; then
+                sleep 0.25  # educated guess
+            else
+                break
+            fi
+        done
+        if [ `cat $PID_FILE_` = $MY_PID_ ]; then
+            rm $PID_FILE_
+            lockfile-remove $PID_FILE_
         fi
-    done
-    if [ `cat $PID_FILE_` = $MY_PID_ ]; then
-        rm $PID_FILE_
-        lockfile-remove $PID_FILE_
+        )&
+        # FORK END
+    else
+        SLEEP_TIME_="$(( $$ % 5 * 5 + 5 ))"
+        echo "grml-screen: Error could not create lockfile! (sleeping for $SLEEP_TIME_)"
+        sleep $SLEEP_TIME_
     fi
-    )&
-    # FORK END
-else
-    SLEEP_TIME_="$(( $$ % 5 * 5 + 5 ))"
-    echo "grml-screen: Error could not create lockfile! (sleeping for $SLEEP_TIME_)"
-    sleep $SLEEP_TIME_
 fi
 
 # now run screen with config