Tengo un script que canalizará su salida a |tee scriptnameYYMMDD.txt
. Después de cada ciclo del ciclo for en el que se genera la salida, invertiré el contenido del archivo tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt
para que la salida del registro sea visible en una ventana del navegador con las líneas más nuevas en la parte superior.
Tendré varios scripts haciendo esto en paralelo. Estoy tratando de minimizar la actividad del disco, por lo que la salida de |tee scriptnameYYYYMMDD.txt
un disco RAM sería lo mejor. mktemp
crea un archivo en la /tmp
carpeta, pero eso no parece estar fuera del disco.
shell-script
files
filesystems
scripting
tmp
usuario208145
fuente
fuente
fstab
con el fin de montar untmpfs
sobre/tmp
y luego reiniciar la máquina.tail
los archivos (o iniciarlos a través de CGI a pedido o algo así) en lugar de hacerlotac
todo.TEMPPATH="/ramdisk"
LOGPATH="/var/www/html/log"
...echo <various calls to echo> | tee -a $TEMPPATH/moveKRT$(date '+%Y%m%d').txt
... al final del ciclo for,cp $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
tengo conocimiento de la minúscula posibilidad de que el cambio de 23: 59: 59.999 a 00:00: 00 puede afectar algunos archivos, pero la posibilidad es aceptable.Respuestas:
Puede montar una
tmpfs
partición y escribir el archivo allí:Esta partición ahora está limitada a 500 MB. Si su archivo temporal crece más de 500 MB se producirá un error:
no space left on device
. Pero, no importa cuando especifique una mayor cantidad de espacio que la RAM de su sistema.tmpfs
usos intercambian espacio demasiado, por lo que no se puede obligar a un fallo del sistema, en contraposición aramfs
.Ahora puede escribir su archivo en
/mountpoint
:fuente
size=[num]%
también está bien: un tmpfs puede limitarse a un porcentaje de memoria disponible. Por lo general, es más fácil de esa manera si los comandos no siempre están dirigidos a la misma máquina (real / virtual) . También es útil que un tmpfs no suelte contenido w /-o remount,size=newsize
.mount
no permitir el uso de usuarios no root-t
o-o
? Es decir, ¿cómo se pueden crear scripts que usentmpfs
(o RAM de cualquier otra manera) para guardar en operaciones de disco, si un sistema de archivos adecuado no existe en el sistema?Prueba esto con Ubuntu:
fuente
/run/shm/
Qué tan estable es escribir ? ¿Puedo aplicarchmod
cambios al archivo temporal si es necesario? Noté que los bits de modo de la carpeta son idénticos a la/tmp
carpeta. Gracias./run/shm
(enlace simbólico a/dev/shm
)mktemp
también tienen un permiso predeterminado de-rw-------
(600) y puede cambiarlo si es necesario consudo chmod
.La siguiente respuesta fue descubierta al investigar las respuestas anteriores y la información en esta pregunta aquí y no se habría encontrado sin ellas. Cudos a ellos.
En mi sistema linuxmint (y supongo que la mayoría de los sistemas basados en ubuntu y posiblemente también basados en debian) hay un tmpfs propiedad del usuario montado automáticamente en
/run/user/1000/
Use
df -T
para verificar.Debajo
/run/user/
hay un directorio para cada usuario normal en el sistemaEstos directorios llevan el nombre de sus respectivos identificadores de usuario. Podemos obtener la identificación de usuario con
id -u
verman id
para obtener detalles sobre este comando.Luego podemos usar el
mktemp
comando con la--tmpdir
opción de crear archivos temporales y directorios en este sistema de archivos temporales, creando así archivos temporales en la RAM.Siguiendo los consejos dados aquí , primero creo un directorio temporal y luego creo mis archivos temporales en eso:
para crear un directorio temporal
/run/user/1000/bash.w42BYxbG/
entoncespara crear un archivo temporal en él.
Esto facilita la limpieza de estos archivos, ya que todo lo que tengo que hacer es
rm -r $mydir
.Por defecto, todos estos archivos son propiedad y solo los puede leer el usuario que los creó.
fuente
/run/user/1000
está disponible en cada Linux que usa systemd, por lo que no solo está disponible en sistemas basados en Debian, sino también en la mayoría de las otras distribuciones de Linux. Si no, se debe usar / tmp en su lugar. Puede simplificar sus comandos utilizando la variable $ XDG_RUNTIME_DIR que ya mantiene el directorio correcto para cada usuario. Para obtener más información, consulte, por ejemplo, esta respuesta: unix.stackexchange.com/questions/162900/…Como yo lo entiendo, los objetivos son: (1) no almacenar el archivo en el disco invertida, para ser servido al navegador (nota: esto podría ser tmpfs, etc, ya que todas las otras respuestas ya detalle); pero, (2) evite escribir el primer archivo tmp en el disco, con la salida original; y, sin embargo, (3) aún muestra la salida original en stdout.
Si es así, lo siguiente podría satisfacer sus necesidades, utilizando la sustitución del proceso bash (es decir, básicamente una tubería con nombre):
Tenga en cuenta que esto está imprimiendo continuamente la salida en stdout, y cuando finaliza el comando (cuando finaliza su ciclo), invierte esa salida y la escribe en el archivo de salida. Ilustrado a través de lo siguiente, que imprime una línea por segundo, y después de la terminación, el archivo
/tmp/foo.txt
contiene las líneas invertidas:fuente