bash atomar reguläre datei ausgeben

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

bash atomar reguläre datei ausgeben
Hallo,

gibt es eine race contition freie bash script alternative zu

a=$(test -f foo && cat foo)

bin gerade dabei mir eine webserver config datei zu generieren möchte und nicht, dass jemand mein script per touch foo; rm foo ; mkfifo foo aufhängen kann.
(ist zwar recht hypothetisch aufm eigenen server wo nur 2 andere leute noch drauf sind, aber fehlerfreie programme sind schöner)

Danke schonmal,
Jonathan


Wie wärs, wenn du foo vorher in eine temporäre Datei kopierst oder hardlinkst? Oder alternativ einfach cat versuchen und den Fehler behandeln, wenn er auftritt.


In nen ordner, in dem nur der richtige nutzer wx hat und gut is


Danke, dsa mit dem hardlink in nen ordner klingt gut

cat versuchen geht ja nicht, weil es auf fifos blockiert


Atomarheit in Shell-Scripts ist so ne Sache.

Die überkorrekte Lösung wäre wohl, ein eigenes cat zu bauen, dass eben [m]open[/m] mit [m]O_NONBLOCK[/m] macht (die Manpage sagt hierzu aber leider auch nur “When possible, the file is opened in nonblocking mode.”, keine Ahnung, wann das noch blockieren kann, NFS?) und darauf dann [m]fstat[/m] machen.

Für die Variante mit Hardlink ist [m]mktemp[/m] übrigens sehr zu empfehlen. Macht das in gescheit und mit sinnvollen Rechten.


Einfach in ein privates Verzeichnis, da brauchst du mktemp nicht. Bei Hardlinks hilft mktmp nicht, denn das erstellt die Datei ja schon.


Die Frage ist aber auch, ob das wirklich ein Problem darstellt. Woher kommt den die Datei? Kann da jeder Nutzer irgendwelche komischen Dinge am Server konfigurieren, wenn er da „komische“ Werte reinschreibt? Normalerweise muss einer Konfigurationsdatei ja sowieso vertraut werden.


mktemp ist eine Option so ein Verzeichnis zu erstellen (-d).

Ich würde mich allerdings nicht darauf verlassen, dass ein Hardlink am Standardpfad klappt - /tmp ist gerne mal ne RAM-disk.

what could possibly go wrong :slight_smile:

ne ich sammle pro (sub)domain (name des verzeichnisses) ein unix socket wo dann jeder user seinen eigenen lighty oder django dev server laufen hat oder eine datei namens redirect ein, da sollten keine komischen dinge passieren

eigentlich ist izibis variente mit eigenem programm die schmerzfreieste, grade weil ja auch ne groessenbeschraenkung gut ware (nein ich will kein 100GB nginx.con) , aber mir ist noch kein SP würdiges wortspiel eingefallen


Ist etwas hässlich,aber das hier scheint zu gehen:

socat -u file:foo,nonblock,seek=0,rdonly stdout

Auf Pipes schlägt das lseek() fehl, auf Dateien nicht.

1 „Gefällt mir“

socat -u file:foo,nonblock,seek=0,rdonly stdout

nett!