check for stuck RPM processes
[mom.git] / pl_mop.sh
index a278230..454982e 100755 (executable)
--- a/pl_mop.sh
+++ b/pl_mop.sh
@@ -187,10 +187,48 @@ kill_multi_nm(){
         /etc/init.d/nm start
     fi
 }
+
+fix_rpm() {
+    echo "* Checking for stuck rpm processes"
+
+    yum_count=`pgrep -f "yum clean all" | wc -l`
+
+    if [[ $yum_count -ge 2 ]]; then
+        echo "* $yum_count yum processes found"
+
+        # kill rpm processes, attempt up to 10 times and then give up
+        try_count=0
+        rpm_count=`pgrep "rpm|yum" | wc -l`
+        while [[ $rpm_count -gt 0 ]]; do
+           echo "* killing rpm/yum processes"
+            killall -9 rpm rpmd rpmq rpmk yum
+            sleep 1
+            rpm_count=`pgrep "rpm|yum" | wc -l`
+            try_count=`expr $try_count + 1`
+            if [[ $try_count -ge 10 ]]; then
+                echo "* failed to kill rpm processes"
+                return
+            fi
+        done
+
+        # remove lock files
+        echo "* deleting rpm lock files"
+        rm -f /var/lib/rpm/__*
+
+        # rebuild rpm database
+        echo "* rebuilding rpm database"
+        rpm --rebuilddb
+
+        echo "* rpm repair sequence complete"
+
+    fi
+}
+
 # XXX kill zombie slices
 
 run restart_services
 
+run fix_rpm
 
 run kill_nonroot_nm