Como criar um arquivo temporário na RAM?

23

Eu tenho um script que canaliza sua saída para |tee scriptnameYYMMDD.txt . Após cada ciclo do loop for no qual a saída é gerada, estarei revertendo o conteúdo do arquivo com tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt para que a saída do log fique visível em uma janela do navegador com as linhas mais recentes na parte superior.

Vou ter vários scripts fazendo isso em paralelo. Eu estou tentando minimizar a atividade do disco, então a saída de |tee scriptnameYYYYMMDD.txt para um disco RAM seria melhor. mktemp cria um arquivo na pasta /tmp , mas isso não parece estar fora do disco.

    
por user208145 06.03.2015 / 06:59

4 respostas

18

Você pode montar uma tmpfs partititon e gravar o arquivo lá:

mount -t tmpfs -o size=500m tmpfs /mountpoint

Esta partição agora está limitada a 500 MB. Se o seu arquivo temporário crescer mais de 500 MB, ocorrerá um erro: no space left on device . Mas, não importa quando você especifica uma quantidade maior de espaço do que seus sistemas de RAM. tmpfs usa espaço de troca também, então você não pode forçar uma falha do sistema, ao contrário de ramfs .

Agora você pode escrever seu arquivo em /mountpoint :

command | tee /mountpoint/scriptnameYYYYMMDD.txt
    
por 06.03.2015 / 07:43
11

Tente isso com o Ubuntu:

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"
    
por 06.03.2015 / 07:12
7

A seguinte resposta foi descoberta investigando as respostas anteriores e as informações nesta questão aqui e não teria sido encontrado sem eles. Cudos para eles.

No meu sistema linuxmint (e eu diria que a maioria dos sistemas baseados no ubuntu e possivelmente baseados no Debian também) existe um tmpfs de propriedade do usuário montado automaticamente em /run/user/1000/

Use df -T para verificar.

11:41:11 jesse@Limbo:~$ df -T
Filesystem     Type      1K-blocks       Used Available Use% Mounted on
udev           devtmpfs   15904812          4  15904808   1% /dev
tmpfs          tmpfs       3184120       1700   3182420   1% /run
/dev/sdb2      ext4       14248880   11464788   2037240  85% /
none           tmpfs             4          0         4   0% /sys/fs/cgroup
none           tmpfs          5120          0      5120   0% /run/lock
none           tmpfs      15920584        848  15919736   1% /run/shm
none           tmpfs        102400         12    102388   1% /run/user
/dev/sdb3      ext4      100861352   90755700   4959136  95% /mnt/data

Em /run/user/ existe um diretório para cada usuário normal no sistema

12:07:35 jesse@Limbo:~$ ls -l /run/user
total 0
drwx------ 2 root  root   40 Aug  7 09:50 0
drwx------ 8 jesse jesse 180 Aug  7 11:38 1000

Esses diretórios são nomeados de acordo com os IDs de seus respectivos usuários. Podemos obter o ID do usuário com id -u see man id para detalhes sobre este comando.

12:07:43 jesse@Limbo:~$ ls -l /run/user/$(id -u)
total 0
drwx------ 2 jesse jesse  60 Aug  7 09:50 dconf
dr-x------ 2 jesse jesse   0 Aug  7 09:50 gvfs
drwx------ 2 jesse jesse  80 Aug  7 09:50 pulse
lrwxrwxrwx 1 root  root   17 Aug  7 09:50 X11-display -> /tmp/.X11-unix/X0

Podemos então usar o comando mktemp com a opção --tmpdir para criar arquivos e diretórios temporários neste sistema de tempfiles, criando assim arquivos temporários na RAM.

Seguindo o conselho fornecido aqui , crio um diretório temporário primeiro e, em seguida, arquivos temporários em que:

mydir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u))

para criar um diretório temporário /run/user/1000/bash.w42BYxbG/ then

myfile=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=$mydir)

para criar um arquivo temporário.

Isso facilita a limpeza desses arquivos, pois tudo que eu preciso fazer é rm -r $mydir .

Por padrão, todos esses arquivos são de propriedade e legíveis apenas pelo usuário que os criou.

Note: The $(basename $0) portion of the command extracts the name of the script/process that executed mktemp. If I have a script /home/jesse/scripts/myScript.sh then $(basename $0) returns myScript.sh when executed by this script. Thus the above commands would create /run/user/1000/myScript.sh.w42BYxbG/ and /run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06 respectively.

    
por 07.08.2016 / 06:48
0

Pelo que entendi, os objetivos são: (1) fazer armazenar o arquivo invertido em disco, para ser servido ao navegador (nota: isso poderia ser tmpfs, etc, como todos os outros respostas já detalhe); mas, (2) evite gravar o primeiro arquivo tmp em disco, com a saída original; e ainda, (3) ainda exibe a saída original para stdout.

Em caso afirmativo, o seguinte pode atender às suas necessidades, usando a substituição do processo bash (ou seja, , basicamente, um pipe nomeado):

command | tee >( tac > /var/www/html/logs/scriptname.txt )

Observe que isso é continuamente imprimir a saída para stdout e, quando o comando termina (quando o loop termina), inverte a saída e grava-a no arquivo de saída. Ilustrado por meio do seguinte, que imprime uma linha por segundo e, após o término, o arquivo /tmp/foo.txt contém as linhas invertidas:

i=0
while [ $i -lt 10 ]; do
    ((i = i+1))
    echo "==$i== $(date)"
    sleep 1
done | tee >( tac >> /tmp/foo.txt ) 
    
por 24.10.2017 / 13:43