[BraLUG] File Locking - vsftpd

Ingo Schaefer ingo at ingo-schaefer.de
Mo Nov 9 18:47:51 CET 2009


Hallo liebe Mitstreiter,

heute mal eine etwas technische Frage von mir in der Hoffnung, jemand
weiss etwas darueber.

Szenario:
Jemand legt per ftp auf einem FTP-Server eine Datei ab. Der Dateiname
dieser wird vom Kommunikationspartner festgelegt. Auf dem Server laeuft
ein Dienst (fileschanged), der so eingestellt ist dass er einen
Schreibzugriff meldet, wenn 2 Sekunden keine weiteren Schreibzugriffe
mehr erfolgt sind und die hochgeladene Datei dann verarbeitet. Das
funktioniert im Prinzip sehr gut, allerdings kommt es manchmal vor, dass
der Upload-Prozess leicht ins Stocken geraet und damit diese Zeitgrenze
ueberschritten wird. Somit wird die Datei bereits verarbeitet, obwohl
sie noch nicht fertig hochgeladen ist. (Seltsamerweise verhindert der
gesetzte write lock ein Verschieben der Datei per "mv" bzw. den unlink()
system call nicht ...)

Frage:
Wie kann man das verhindern?

Hintergrundinformationen:
Betriebssystem ist opensuse 11.0

Als FTP-Server wird vsftpd verwendet, der Benutzer mit dem der
ftp-Upload erfolgt ist ein anderer Benutzer als der unter dem die
Verarbeitung stattfindet. Keiner der Benutzer ist root, so dass ein
Ansatz ueber "lsof" leider ausscheidet.

Man sieht (als root), dass der vsftpd beim Upload einen write lock auf
die Datei hat, der ist dummerweise in dieser Version bereits per fcntl()
gesetzt und nicht mehr per flock() - letzteres koennte man per
Kommandozeile abpruefen.

Ich suche also konkret nach einer (nicht zerstoererischen) Methode,
diesen write lock zu erkennen, um die Verarbeitung eventuell einige
Sekunden zu verschieben.

Ach ja: der Linux-Kernel meldet leider das "FILE_CLOSE" nicht an
fileschanged ;-( weiter.

leicht ratlose Gruesse,
Ingo




Mehr Informationen über die Mailingliste Bralug