Ich habe ein Skript, an das die Ausgabe weitergeleitet wird |tee scriptnameYYMMDD.txt
. Nach jedem Zyklus der for-Schleife, in der die Ausgabe generiert wird, kehre ich den Dateiinhalt um, tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt
sodass die Protokollausgabe in einem Browserfenster mit den neuesten Zeilen oben sichtbar ist.
Ich werde mehrere Skripte gleichzeitig ausführen lassen. Ich versuche, die Festplattenaktivität zu minimieren, daher ist die Ausgabe von |tee scriptnameYYYYMMDD.txt
auf eine RAM-Disk am besten. mktemp
Erstellt eine Datei im /tmp
Ordner, die jedoch nicht offline zu sein scheint.
shell-script
files
filesystems
scripting
tmp
user208145
quelle
quelle
fstab
um eine Montagetmpfs
auf/tmp
und dann den Rechner neu starten.tail
die Dateien inkrementell zu erstellen (oder sie auf Anfrage oder so etwas über CGI zu starten), anstatttac
das Ganze zu erstellen.TEMPPATH="/ramdisk"
LOGPATH="/var/www/html/log"
...echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt
... am Ende der for-Schleife bincp $TEMPPATH/moveKRT$(date '+%Y%m%d').txt $LOGPATH/moveKRT$(date '+%Y%m%d').txt
tac $TEMPPATH/moveKRT$(date '+%Y%m%d').txt > $LOGPATH/moveKRT.txt
ich mir der winzigen Möglichkeit bewusst, dass der Wechsel von 23: 59: 59.999 auf 00:00: 00 kann sich auf einige Dateien auswirken, aber die Chance ist akzeptabel.Antworten:
Sie können eine
tmpfs
Partition mounten und die Datei dort schreiben:Diese Partition ist jetzt auf 500 MB beschränkt. Wenn Ihre temporäre Datei größer als 500 MB wächst tritt ein Fehler auf:
no space left on device
. Es spielt jedoch keine Rolle, wenn Sie mehr Speicherplatz angeben, als der Arbeitsspeicher Ihres Systems hat.tmpfs
Verwendet auch Swap Space, sodass Sie im Gegensatz zu keinen Systemabsturz erzwingen könnenramfs
.Sie können jetzt Ihre Datei schreiben in
/mountpoint
:quelle
size=[num]%
ist auch in Ordnung - ein tmpfs kann auf einen Prozentsatz des verfügbaren Speichers begrenzt werden. Dies ist normalerweise einfacher, wenn die Befehle nicht immer auf dieselbe (reale / virtuelle) Maschine abzielen. Praktisch ist auch, dass ein tmpfs keine Inhalte mit fallen lässt-o remount,size=newsize
.mount
Benutzer ohne Rootberechtigung das Skript nicht verwenden dürfen-t
oder nicht-o
. Das heißt, wie kann man Skripte erstellen, dietmpfs
(oder auf andere Weise) RAM zum Speichern von Festplattenoperationen verwenden, wenn auf dem System noch kein geeignetes Dateisystem vorhanden ist?Versuchen Sie dies mit Ubuntu:
quelle
/run/shm/
? Kann ichchmod
bei Bedarf Änderungen an der temporären Datei vornehmen? Ich habe festgestellt, dass die Modusbits des Ordners mit denen des Ordners identisch sind/tmp
. Vielen Dank./run/shm
(symlink to/dev/shm
) erzeugte Dateienmktemp
eine Standardberechtigung von-rw-------
(600) und können bei Bedarf mit geändert werdensudo chmod
.Die folgende Antwort wurde durch Untersuchen der vorherigen Antworten und der Informationen in dieser Frage hier entdeckt und wäre ohne sie nicht gefunden worden. Ein dickes Lob an sie.
Auf meinem LinuxMint-System (und ich würde davon ausgehen, dass die meisten Ubuntu-basierten Systeme und möglicherweise auch Debian-basierte Systeme) ist ein benutzereigener tmpfs installiert, der automatisch darauf installiert wird
/run/user/1000/
Verwenden Sie
df -T
zu überprüfen.Darunter
/run/user/
befindet sich ein Verzeichnis für jeden normalen Benutzer im SystemDiese Verzeichnisse sind nach den IDs ihrer jeweiligen Benutzer benannt. Wir können die Benutzer - ID mit bekommen
id -u
sieheman id
für weitere Einzelheiten zu diesem Befehl.Wir können dann den
mktemp
Befehl mit der--tmpdir
Option verwenden, um temporäre Dateien und Verzeichnisse in diesem tempfilesystem zu erstellen und so tempfiles im RAM zu erstellen.Gemäß den hier gegebenen Hinweisen erstelle ich ein temporäres Verzeichnis und erstelle dann meine temporären Dateien darin:
erstellen ein temporäres Verzeichnis
/run/user/1000/bash.w42BYxbG/
danndarin ein tempfile erstellen.
Das macht das Aufräumen dieser Datei einfach, da ich nur noch tun muss
rm -r $mydir
.Standardmäßig gehören alle diese Dateien und können nur von dem Benutzer gelesen werden, der sie erstellt hat.
quelle
/run/user/1000
ist auf jedem Linux verfügbar, das systemd verwendet, daher ist es nicht nur auf debian-basierten Systemen verfügbar, sondern auch auf den meisten anderen Linux-Distributionen. Wenn nicht, sollte stattdessen / tmp verwendet werden. Sie können Ihre Befehle vereinfachen, indem Sie die Variable $ XDG_RUNTIME_DIR verwenden, die für jeden Benutzer bereits das richtige Verzeichnis enthält. Weitere Informationen finden Sie z. B. in dieser Antwort: unix.stackexchange.com/questions/162900/…Wie ich es verstehe, sind die Ziele: (1) Sie auf die Festplatte die Reversed - Datei speichern, an den Browser bedient werden (Anmerkung: diese tmpfs sein könnte, etc, da alle anderen Antworten bereits ausführlich); (2) Vermeiden Sie es jedoch, die erste tmp-Datei mit der ursprünglichen Ausgabe auf die Festplatte zu schreiben. und dennoch zeigt (3) immer noch die ursprüngliche Ausgabe auf stdout an.
In diesem Fall kann das Folgende Ihren Anforderungen mit der Bash-Prozessersetzung (dh im Grunde genommen einer Named Pipe) gerecht werden :
Beachten Sie, dass die Ausgabe kontinuierlich auf stdout gedruckt wird. Wenn der Befehl endet (wenn die Schleife beendet wird), wird die Ausgabe umgekehrt und in die Ausgabedatei geschrieben. Die folgende Abbildung gibt eine Zeile pro Sekunde aus. Nach Beendigung
/tmp/foo.txt
enthält die Datei die umgekehrten Zeilen:quelle