2016-03-22 4 views
0

Ich habe ein kleines Programm, das ausgeführt wird und erzeugt einen neuen Text-Dump alle 30sec-1min über Cron.Lesen einer Datei erstellt von einem Cron-Job

program > dump.txt 

Allerdings habe ich eine andere PHP-Web-Programm, das die Textausgabe in einem Read-Only-Modus greift, wenn jemand die Webseite besucht. Das Problem ist, dass ich glaube, wenn jemand auf die Website die Sekunde, die der Cron-Auftrag läuft die Webseite liest möglicherweise nur die Hälfte der Datei, weil ich denke, Linux nicht die Datei sperren, wenn > verwendet wird.

Ich dachte zu tun:

echo "###START###" > dump.txt 
program >> dump.txt 
echo "###END###" >> dump.txt 

Dann, wenn die PHP-Webseite die Dump im Speicher liest, könnte ich eine Regex tun, um zu überprüfen, ob der Start- und End-Flags vorhanden ist, und wenn nicht, dann zu versuchen wieder, bis es die Datei mit beiden Flags liest.

Wird dies die Dateiintegrität sicherstellen? Wenn nicht, wie kann ich sicherstellen, dass, wenn ich dump.txt lese, es intakt ist.

Antwort

4

Anstatt die Datei im Verzeichnis zu erstellen, warum nicht anderswo erstellen? Dann, nachdem die Daten geschrieben wurden, verschieben Sie sie einfach in den Webroot und überschreiben den vorherigen Satz.

Beispiel:

sh create_some_data.sh > /home/cronuser/my_data.html 
mv /home/cronuser/my_data.html /var/www/ 
+0

Wenn ich den vorherigen Satz mit mv, während die PHP-Web-Programm überschrieben wird eine 500-Zeile-Dump zu lesen, kann ich nur erhalten die Hälfte der alten Datei oder ein nicht definiertes Verhalten ?? Vielleicht könnte meine vierte Zeile ein mv-Befehl sein, also könnte ich immer noch nach den 2 Flags suchen, für den Fall, dass ein seltenes Ereignis passiert. – Brandon

+0

Möglicherweise erhalten Sie die alte Datei anstelle der neuen, da das Timing schlecht ist. Bei Ausfall eines Laufwerks würden Sie jedoch nie die Hälfte der alten Datei erhalten. Solange Sie einen aktiven Zeiger auf die alte aktive Datei haben, überschreibt das Dateisystem diese Daten nicht. Der Befehl mv hat nichts damit zu tun, einen Teil der Datei zu schreiben. Es verschiebt die Verknüpfung zu der Datei von einem Inode zu einem anderen in der Dateisystemstruktur. Wenn Sie einen Lesevorgang ausführen, garantiert das Dateisystem, dass Sie von dem angeforderten Inode lesen. – aestrivex

+0

Ein Umbenennen (oder eine Bewegung, die eigentlich das Gleiche ist) ist atomar, wenn es sich auf demselben Dateisystem befindet. Also alles, was @aestrivex sagt, trifft zu. Wenn Sie jemals Zweifel haben, schauen Sie sich an, wie maildir es macht. – izak