Ich suche nach einer Befehlszeilenfunktion oder einer c-Funktion, die mich darüber informiert, ob eine Datei von etwas geöffnet / verwendet wird.
lsof
und fuser
sagen Sie dies, aber sie bieten viele andere Informationen, die in einigen Situationen bis zu 300 ms dauern (z. B. wenn ich diesen Code unter MAC OS X verwende, entwickle ich für Linux und OS X) (ich habe ein Windows Lösung, die 5 ms dauert, also versuche ich, etwas in Unix zu finden, das auch sehr schnell ist und nur true oder false zurückgibt, wenn eine Datei verwendet wird.
command-line
files
Noitidart
quelle
quelle
Antworten:
Wenn Sie dies als Schloss verwenden, funktioniert es weder als
lsof
nochfuser
verhindert es die Rennbedingungen.Der grundlegende Prozess
lsof
besteht darin, alle Prozesse/proc/*/fs
nach offenen Dateideskriptoren zu durchsuchen. Dies wird einige Zeit dauern, egal was Sie tun.Sie können dies selbst tun, aber es ist wahrscheinlich nicht schneller, da Sie nach jedem offenen Prozess auf dem System suchen müssen.
Wenn das, was Sie tun, zeitkritisch ist, finden Sie einen anderen Weg, dies zu tun.
/proc/<PID>/fs
, ob Ihre Datei gerade geöffnet ist oder nicht. Wenn Sie nur einen Prozess betrachten, sind offene Dateideskriptoren viel schneller als die Zuordnung über alle Prozesse.Sie haben in einem Kommentar weitere Informationen angegeben, mit denen Sie feststellen möchten, ob Firefox auf einem bestimmten System ausgeführt wird. Der beste Weg, dies zu tun, besteht darin, nach den Sperrdateien von Firefox zu suchen. Diese werden an den im Mozilla-Wiki angegebenen Standardspeicherorten gespeichert .
Lassen Sie Ihr Programm unter Linux beispielsweise Folgendes ausführen:
~/.mozilla/firefox/
Verzeichnis..default
. (Ich denke, alle Profile enden mit.default
, wenn nicht nur in jedes Verzeichnis kriechen.)lock
oder.parentlock
. Wenn Sie eine oder beide Dateien sehen, ist Firefox geöffnet.Dieser Algorithmus sollte schneller ausgeführt werden als derzeit unter Windows.
quelle
ps aux firefox
. Nehmen Sie diese PIDs und suchen Sie sie im/proc/
Dateisystem nach.ps aux firefox
. Nun, meine genaue Situation ist: Ich habe den Pfad zu einer Datei. Es ist gesperrt, wenn Firefox ausgeführt wird. Ich möchte sehen, ob es gesperrt ist oder nicht, ob Firefox ausgeführt wird.TL; DR
In einem Ihrer Kommentare geben Sie an:
Ihre ursprüngliche Frage zu Sperrdateien scheint weit entfernt zu sein, wenn es einfachere Möglichkeiten gibt, herauszufinden, ob Firefox für einen bestimmten Benutzer ausgeführt wird, und seinen Prozessstatus zu überprüfen.
Prozessstatus untersuchen
Ein sinnvollerer Weg, um die PID eines bestimmten Prozesses zu ermitteln, ist die Verwendung von pgrep aus dem procps- Paket. Zum Beispiel:
Sie können dann den Status der PID mit ps überprüfen :
oder holen Sie sich einfach die Staatsflaggen ohne andere Kruft:
Bei einem meiner Systeme dauert der oben genannte Einzeiler durchweg nur 1,4 Millisekunden. Ihr Kilometerstand kann variieren.
Prozessstatuscodes
Im Abschnitt PROCESS STATE CODES von ps (1) wird detailliert beschrieben, was die verschiedenen Statusflags bedeuten. Unter Ubuntu 14.04 heißt es auf der Manpage:
quelle
~/.mozilla/firefox/*/lock
. Sie können die Sitzung dann identifizieren, indem Sie den übergeordneten Verzeichnisnamen jeder Sperrdatei anzeigen. Auf anderen Plattformen funktioniert dies nicht. In unserem Chat geht es mehr darum, wie man es auf Macs zum Laufen bringt (was für Ubuntu irgendwie irrelevant ist, aber da haben Sie es). Um fair zu sein, sollte er die Frage wirklich aktualisieren, um genauer zu sein. : P