lsof: Anzeigen aller Prozesse die auf eine bestimmte Datei zugreifen

S

supersucker

Foren Gott
Mahlzeit zusammen,

ich blick gerade bei folgendem nicht durch:

Laut manpage sollte mir doch ein

Code:
lsof mein_file

mir anzeigen wer alles gerade diese Datei benützt.

Mache ich aber nun folgendes:

Code:
touch foo
gedit foo &
lsof foo

kriege ich keine Ausgabe?

Ein

Code:
ps aux | grep gedit

zeigt mir aber

Code:
1000     14082  0.2  4.0  70300 20944 pts/1    S    13:52   0:02 gedit foo

Was hab ich hier übersehen?

P.S. : System Ubuntu Egdy, lsof: 4.77
 
Möglicherweise bearbeitet 'gedit' die Datei foo nicht direkt, sondern verwendet eine temporäre Datei.
Machmal
Code:
lsof | grep foo
oder
Code:
lsof | grep gedit

Gruss
d22
 

hat leider keine Ausgabe.

Ich erkläre mal kurz warum ich das eigentlich brauche:

ich hab eine Applikation geschrieben, die unter anderem Dateien aus definierten Verzeichnissen einliest.

In diese Verzeichnisse können die Dateien auf verschiedensten Wegen gelangen (händisch kopieren, scripte usw.)

Nun möchte ich sicherstellen, das - wenn ich die Dateien einlese - diese schon komplett in das Verzeichnis geschrieben wurde, so das ich nicht eine Datei einlese die noch mitten im Kopiervorgang ist.

Jemand ne Idee

1. warum


keine Ausgabe hat?

2. Wie man das vielleicht sonst noch lösen könnte?
 
Ich würde bahupten das hängt mit 'gedit' zusammen. Ich verwende auch Ubuntu Egdy und 'lsof' 4.77.
Code:
adminjfu@hsg09017-d:/tmp$ ls -lh foo
-rw-r--r-- 1 adminjfu adminjfu 260M 2007-03-16 14:24 foo
adminjfu@hsg09017-d:/tmp$ cp foo foo_cp
gleichzeitig:
Code:
adminjfu@hsg09017-d:~$ fuser /tmp/foo_cp
/tmp/foo_cp:         19032
adminjfu@hsg09017-d:~$ lsof /tmp/foo_cp 
COMMAND   PID     USER   FD   TYPE DEVICE      SIZE    NODE NAME
cp      19032 adminjfu    4w   REG    8,1 194494464 4954716 /tmp/foo_cp

Und wenn ich das Ganze mit 'gedit' versuche ist das Resultat folgendes:
Während dem Öffnen der Datei ('gedit /tmp/foo_cp')
Code:
adminjfu@hsg09017-d:~$ lsof /tmp/foo_cp
COMMAND   PID     USER   FD   TYPE DEVICE      SIZE    NODE NAME
gedit   19080 adminjfu  mem    REG    8,1 271663104 4954716 /tmp/foo_cp
gedit   19080 adminjfu   16r   REG    8,1 271663104 4954716 /tmp/foo_cp
adminjfu@hsg09017-d:~$ fuser /tmp/foo_cp 
/tmp/foo_cp:         19080m
Nach dem 'gedit' gestartet ist (mit einer normalen Textdatei), nichts, wie bei dir.

Gruss
d22
 
Vielleicht findest Du in diesen FAQs was:

http://www.jfranken.de/homepages/johannes/vortraege/lsof/00FAQ.txt

Dort steht z.B:

3.14 Why doesn't lsof find a process that ps finds?

If lsof fails to display open files for a process that ps
indicates exists, there may be several reasons for the
difference.

The process may be a "zombie" for which ps displays the
"(defunct)" state. In that case, the process has exited
and has no open file information lsof can display. It does
still have a process structure, sufficient for the needs
of ps.

Another possible explanation is that kernel tables and
structures may have been changing when lsof looked for the
process, making lsof unable to find all relevant process
structures. Try repeating the lsof request
 
Danke euch beiden erst mal für die Hinweise.

3.14 Why doesn't lsof find a process that ps finds?

If lsof fails to display open files for a process that ps
indicates exists, there may be several reasons for the
difference.

The process may be a "zombie" for which ps displays the
"(defunct)" state. In that case, the process has exited
and has no open file information lsof can display. It does
still have a process structure, sufficient for the needs
of ps.

Another possible explanation is that kernel tables and
structures may have been changing when lsof looked for the
process, making lsof unable to find all relevant process
structures. Try repeating the lsof request

Hmm,

keiner von den Fällen trifft bei mir zu.

Sehr unbefriedigend das Ganze.

Tja, was nun, es muss doch einen Weg unter Linux geben mit 100% -iger Sicherheit sagen zu können: Auf Datei foo greift kein einziger Prozeß zu.

Wie schon gesagt, die Dateien können von überall auf alle möglichen Arten kommen, es kann auch sein, das darin jemand rumeditiert während ich lesen will.

Und ich kann ja unmöglich auf alle möglichen Prozesse ein "ps" machen.

Das hier

es muss doch einen Weg unter Linux geben mit 100% -iger Sicherheit sagen zu können: Auf Datei foo greift kein einziger Prozeß zu.

MUSS doch irgendwie möglich sein.

Oder?

Bin für alle Anregungen dankbar.........:)
 
Ich würde sagen, es ist möglich, nämlich mit 'lsof' und 'fuser'! Das problem ist nur, wenn gewisse Programme mit Temp-Dateien arbeiten. z.B
Code:
adminjfu@hsg09017-d:/tmp$ lsof | grep foo
vi        20879    adminjfu    4u      REG        8,1    12288    4954719 /tmp/.foo.swp
Auf die Datei foo wird nicht zugegriffen, erst beim speichern wir die echte Datei foo berührt.
Und ich würd sagen, kein Programm kann dir sagen, ob ein anderes Programm in der nächsten Zeit vor hat in eine bestimmte Datei zu schreiben.

Gruss
d22
 
Moin,
...wie wäre es mit einer ganz anderen Idee?
Kannst Du irgendwie in Deinen Scripten mit .lock-Dateien arbeiten?

HTH,
telsh
 
Zurück
Oben