Schrift
[thread]959[/thread]

Datei sperren: flock()

Leser: 1


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
bieber
 2007-07-10 15:25
#307 #307
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
ich schon wieder....

zuerst einmal ich habe bereits das wiki von pq und diesen
Artikel zum Thema flock gelesen (man habt ihr euch da gezofft^^)

so weit so gut, mein Problem ist nun, dass mein CGI-Programm daraus besteht eine Datei per Browser zu bearbeiten(ich weiß nicht elegant, ist aber halt so...)

bis vor ner Stunde wusste ich noch gar nicht, dass es flock() gibt, weshalb ich leider schon was eigenes geschrieben habe....
dabei lege ich mir ein eigenes Logfile an, in welchem ich eintrage seit wann, wer mit der Datei arbeitet -> andere werden sofort abgewiesen wenn dort ein Eintrag ist (timeouts sind auch schon eingebaut)

das schöne bei dieser Variante ist, dass ich Nutzern die nicht zugreifen können ausgeben kann durch wen die Datei gesperrt wird

Also, meine Frage ist nun: Geht das auch mit Hilfe von flock()?? also ausgeben durch wen es gesperrt wurde? Leider ist mir auch nicht bekannt wie flock() die Datei für andere sperrt (meine Perlkenntnisse sind halt sehr begrenzt)
wenn das irgendwie geht könnte ich nämlich den ganzen Mist den ich da geschrieben habe gepflegt löschen....

Anmerkung: jeder Nutzer muss sich zunächst via htaccess indentifizieren, -> $ENV{REMOTE_USER} liefert den Namen
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
murphy
 2007-07-10 16:53
#308 #308
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich denke, man kann nicht auf portable Art und Weise herausfinden, welcher Benutzer eine Datei gesperrt hat. Eventuell findest du aber bei deinem System entsprechende Informationen irgendwo im /proc-Dateisystem.

Auf jeden Fall wird dir diese Information vermutlich auch nur begrenzt weiterhelfen, denn wenn überhaupt, findest du den Systembenutzer heraus, der die Sperre angelegt hat, nicht aber den Benutzer deiner Webanwendung. In aller Regel läuft ja das CGI-Programm immer unter dem gleichen Benutzerkonto. Du musst also irgendwie noch mit einer Tabelle die Webbenutzer den laufenden CGI-Prozess-IDs zuordnen.

Im übrigen ist dir schon klar, dass eine flock Sperre immer nur so lange lebt, wie der Prozess, der sie angelegt hat, dass deine CGI-Prozesse sich also im Speicher halten müssen, während sie die Datei sperren?
When C++ is your hammer, every problem looks like your thumb.
bieber
 2007-07-10 17:03
#309 #309
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
nein das war mir nicht bekannt,
dann fliegt flock() für mich sowieso raus, dann muss mein eigener code zum sperren doch weiter laufen...

Dankschön für die schnelle Info
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
bloonix
 2007-07-11 14:41
#310 #310
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Wenn du auf einem unixoiden System arbeitest, dann ist der Befehl
fuser das was du brauchst. Je nach System heißt der Befehl vermutlich
anders, aber auf einem Linux heißt er so.\n\n

<!--EDIT|opi|1184150568-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-07-11 15:44
#311 #311
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
ich hab gerade selbst mal ein wenig auf CPAN nach Linuxmodulen gesucht
und bin dabei auf CPAN:Linux::Fuser gestoßen :)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
sid burn
 2007-07-11 16:04
#312 #312
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=opi,11.July.2007, 13:44]ich hab gerade selbst mal ein wenig auf CPAN nach Linuxmodulen gesucht
und bin dabei auf CPAN:Linux::Fuser gestoßen :)[/quote]
Das hilft ihm aber auch nicht weiter.

fuser zeigt ja nur die PID, user von offenen Dateien an. Ein CGI Skript läuft aber nur kurz und hält eine Datei nicht die ganze Zeit offen.

Weiterhin möchte er ja auch nicht die PID oder den Systemuser haben (der das CGI Skript gestartet hat) sondern einen Webuser.

-----------

Bestimmte OS Implementation wie flock() sollten dir also nicht weiter Helfen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
betterworld
 2007-07-11 16:06
#313 #313
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=opi,11.07.2007, 12:41]Wenn du auf einem unixoiden System arbeitest, dann ist der Befehl
fuser das was du brauchst. Je nach System heißt der Befehl vermutlich
anders, aber auf einem Linux heißt er so.[/quote]
Das hat aber trotzdem das von murphy angesprochene Problem, dass es fuer ein CGI-Wiki nicht weiterhilft, da die Dateien laenger gelockt sein sollen als die Prozesse laufen.

Auf meinem Linux hingegen zeigt fuser uebrigens keine Locks an, sondern nur, wer die Datei geoeffnet hat. Laut dem vom OP verlinkten Beitrag (der von ptk und nicht von pq ist), kann man aber wohl auf FreeBSD mit lsof rausfinden, wer eine Datei gelockt hat.
bieber
 2007-07-11 16:14
#314 #314
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
joar und den user den man mit Linux:Fuser bekommt ist ja in meinem Fall dann immer der wwwrun, sprich der Webserver


macht euch keinen Kopf, ich hab mir ne init-Subfunktion geschrieben, die wird jetzt bei jeden Seitenaufruf zunächst gestartet, der erste der diese Funktion startet schreibt sich dann so ne art session in eine Datei rein, so kommt kein anderer mehr rein....

da die Anzahl der Nutzer und die Häufigkeit der Nutzung recht gering ist, reicht diese Lösung


trotzdem danke, kann man an anderer Stelle bestimmt gut gebrauchen ;)
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
sid burn
 2007-07-11 16:19
#315 #315
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
File Locks stehen übrigens in: /proc/locks

Sind aber nur Advisorys. Sprich daran muss sich keiner halten. Aber das ist ja flock() auf Linux Generell. Glaube nur die BSD Systeme verfügen über einen Exclusiven Lock.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-07-11 17:54
#316 #316
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Wenn man die Prozess ID hat, dann kann man auch in der Umgebung
der Prozess ID nach REMOTE_USER suchen. Die Umgebung kann man in
/proc/<pid>/environ absuchen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Linux::Fuser;

my $fuser = Linux::Fuser->new();
my @procs = $fuser->fuser($file) or die $!;
my $ruser = ();

foreach my $proc (@procs) {
  my $pid = $proc->pid;

  open my $fh, '<', "/proc/$pid/environ" or die $!;
  my $env = do { local $/; <$fh> };
  foreach my $pair (split /\0/, $env) {
     next unless $pair =~ /^\s*REMOTE_USER=(.+)/;
     $ruser .= "$1<br/>";
  }  
}


Bei mir funktioniert das [s]hervorragend[/s], obwohl es umständlich ist und es
sicher bessere Lösungen gibt. Aber da gibt es noch das Problem, dass
www-run nicht die notwendigen Rechte hat /proc/<pid>/fd zu lesen.\n\n

<!--EDIT|opi|1184162655-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2007-07-10 15:25.