2016-04-15 16 views
1

Ich versuche, ein kleines Shell-Skript zu erstellen, das eine veraltete /var/lib/dpkg/lock-Datei erkennen und entfernen würde, wenn es keine laufenden dpkg-Prozesse gibt.Wie kann ich eine veraltete dpkg-Sperrdatei programmgesteuert entfernen?

Wie kann ich das tun? ... vorzugsweise unter Verwendung eines Einzeiler :)

+0

nur eine Vermutung, aber versuchen, es zu löschen. Wenn es von einem Prozess verwendet wird, schlägt das Löschen fehl. – Marichyasana

Antwort

0
sudo lsof | grep -q /var/lib/dpkg/lock || sudo rm -f /var/lib/dpkg/lock 

Erläuterung:

1. lsof: list open files 
2. | (= pipe to) grep: is /var/lib/dpkg/lock in the list? 
3. || (= or) rm: no? rm it! 
0

Es gibt mehrere Möglichkeiten Entfernen einer Sperrdatei in der Weise, die Sie beschreiben, zu nähern. (Ein geeigneterer Weg besteht jedoch darin, die Sperrdatei (oder lockdir für atomic locking) zu erstellen, die den PID des laufenden Prozesses enthält). Für den einfachen Fall, den Sie beschreiben, können Sie jedoch pidof für den Namen des laufenden Prozesses als eine andere Art von Prüfung verwenden.

(seien Sie sich nur bewusst, wenn mehrere Prozesse unter demselben Namen laufen, die Lockfile wird entfernt und es gibt keine Korrelation darüber, zu welchem ​​Prozess die Lockfile gehörte).

Ein kurzes Skript für Ihre Situation könnte die Verwendung von pidof (die Einschränkungen und Subjekt) zu machen sein:

#!/bin/bash 

test -z "$1" && { ## validate required input/show usage 
    printf "error: insufficient input, usage: %s procnm [lockfile].\n" \ 
      "${0//*\/}" >&2 
    exit 1 
} 

procnm="$1"       ## process name 
victim=${2:-/var/lib/dpkg/lock}  ## lockfile name 

if [ ! -n "$(pidof "$procnm")" ] ## test pidof name 
then        ## if not running, rm lock 
    [ -f "$victim" ] && rm "$victim" 
fi 

Das Skript führt den Prozessnamen als erstes Argument und ein optionales zweites Argument des lockfile Lage. (Angenommen, Sie haben Ihre beabsichtigte Sperrdatei als Standard fest programmiert). z.B.

$ bash rmlock.sh 
error: insufficient input, usage: rmlock.sh procnm [lockfile]. 
Verwandte Themen