various fixes and improvements
[distro-setup] / mount-latest-subvol
index d7be613c763d122d0259b5a434ca4a161f599627..36895aa1612ad1d58bc923775d19887117fdf60f 100644 (file)
@@ -82,23 +82,25 @@ fstab() {
     done
 }
 kill-dir() {
-    found_pids=false
-    sig=${1:-TERM}
-    if pids=$(timeout 4 lsof -t $dir); then
-        found_pids=true
-        timeout 4 lsof -w $dir
-        kill -$sig $pids
-    fi
-    # fuser will find open sockets that lsof won't, for example from gpg-agent.
-    # note: -v shows kernel processes, which then doesn't return true when we want
-    if timeout 4 fuser -m $dir &>/dev/null; then
-        found_pids=true
-        fuser -$sig -mvk $dir
-    fi
-    if $found_pids; then
+    for sig; do
+        echo kill-dir $sig
+        found_pids=false
+        if pids=$(timeout 4 lsof -t $dir); then
+            found_pids=true
+            timeout 4 lsof -w $dir
+            kill -$sig $pids
+        fi
+        # fuser will find open sockets that lsof won't, for example from gpg-agent.
+        # note: -v shows kernel processes, which then doesn't return true when we want
+        if timeout 4 fuser -m $dir &>/dev/null; then
+            found_pids=true
+            fuser -$sig -mvk $dir
+        fi
         sleep .5
-        return 0
-    fi
+        if ! $found_pids; then
+            return 0
+        fi
+    done
     return 1
 }
 
@@ -192,7 +194,9 @@ for vol in q a o i; do
             if e umount -R $dir; then
                 unmounted+=($dir)
             else
-                kill-dir || kill-dir INT || kill-dir HUP || ! $force || kill-dir KILL ||:
+                if ! kill-dir TERM TERM TERM INT INT HUP HUP; then
+                    if $force; then  kill-dir KILL; fi
+                fi
 
                 if e umount -R $dir; then
                     unmounted+=($dir)