2010-03-26 2 views
6

Ich versuche eine einzelne Datei zu testen, wenn sie mit lsof geöffnet ist. Gibt es einen schnelleren Weg?Was ist der schnellste Weg mit lsof eine einzelne offene Datei zu finden?

$result = exec('lsof | grep filename | wc -l'); 

if($result > 0) { 
    //file is open 
} 

Ich denke, sie ein Weg sein, muss nur für eine Datei zu testen, wenn Sie die Dateinamen kennen. Alles, was ich wirklich brauche, ist ein Wahres oder Falsches.

Antwort

9

Ich fand einen viel besseren Weg. Mit lsof (getestet auf Version 4.63) können Sie direkt eine bestimmte Datei abfragen:

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

Nun, Sie wc und verwenden den Rückgabewert von grep überspringen können (grep gibt 0 (dh Erfolg), wenn sie das Muster und 1 (dh nicht-Erfolg feststellt), wenn es nicht das Muster erkennen):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

Sie können dies durch die Verwendung des grep -l Flagge etwas verbessern:

if lsof | grep -l filename > /dev/null; then 
... 

Dies sagt grep suchen zu stoppen, sobald sie es erste Spiel erkennt.

+0

Wenn Sie sich eigentlich für den Prozess interessieren, der die Datei verwendet, verwenden Sie besser die Option "-m 1" für grep, damit Sie anstelle des Dateinamens (stdin) die passende Zeile finden. schöne alternative Verwendung von "-l".) – Cascabel

1

Verwendung fuser. Wenn eine der angegebenen Dateien verwendet wird, gibt sie einen Wert ungleich null zurück und null, wenn sie alle verfügbar sind.

1

Nicht. Die Antwort kann sich ändern, wenn Sie versuchen, etwas mit dem Ergebnis zu tun. Versuchen Sie stattdessen, das zu tun, was Sie mit der Datei machen wollten, und behandeln Sie den Fehler "In Verwendung" oder "Verletzung teilen".

+0

Für Sie: +1, von dem, was ich sehe, ich denke, Sie könnten Recht haben. Obwohl Ihre Antwort die Frage nicht speziell beantwortet. – jjclarkson

+0

Jared Parsons hat eine schöne Zusammenfassung darüber, warum die Frage selbst grundlegend fehlerhaft ist: http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx In solchen Fällen ist es am besten, die Frage, die WAS gestellt wurde, nicht zu beantworten, sondern die Frage, die SOLL gefragt werden sollte. –

+0

-1 aus ein paar Gründen. Erstens, die Antwort "nicht" ist * auch * naiv und fehlgeleitet. Es gibt verschiedene berechtigte Gründe dafür, direkt danach fragen zu wollen, ob Dateien geöffnet sind oder Advisory-Sperren gehalten werden, wie zum Beispiel Debugging, Überwachung oder Warnung eines Benutzers, dass er seine Änderungen möglicherweise nicht speichern kann. Zweitens zwingen Dateizeiger in Unix standardmäßig keine Sperrung; Wenn Sie nicht ausdrücklich 'flock' oder einen anderen Sperrmechanismus verwenden, erhalten Sie * keinen * Fehler" in Verwendung "oder" Verstoß wird geteilt "- Sie werden Ihre Datei nur munter verstümmeln. –

Verwandte Themen