web-dev-qa-db-ja.com

RAMに一時ファイルを作成する方法は?

出力を|tee scriptnameYYMMDD.txtにパイプするスクリプトがあります。出力が生成されるforループの各サイクルの後、tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txtを使用してファイルの内容を逆にし、最新の行が一番上にあるブラウザーウィンドウにログ出力が表示されるようにします。

これを並行して実行するいくつかのスクリプトを用意します。私はディスクアクティビティを最小限にしようとしているので、|tee scriptnameYYYYMMDD.txtからRAMdiskへの出力が最適です。 mktemp/tmpフォルダーにファイルを作成しますが、それはディスク外ではないようです。

31
user208145

tmpfsパーティションをマウントして、そこにファイルを書き込むことができます。

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

現在、このパーティションは500 MBに制限されています。一時ファイルが500 MBを超えると、エラーが発生します:no space left on device。ただし、システムよりも多くのスペースを指定する場合は重要ではありませんRAM=です。tmpfsもスワップスペースを使用するため、システムクラッシュを強制することはできません。 ramfsとは対照的です。

これで、ファイルを/mountpointに書き込むことができます。

command | tee /mountpoint/scriptnameYYYYMMDD.txt
24
chaos

Ubuntuでこれを試してください:

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"
10
Cyrus

次の回答は、以前の回答とこの質問の情報 here を調査して発見されたものであり、それらがなければ見つからなかったでしょう。彼らへの賞賛。

私のlinuxmintシステム(ほとんどのUbuntuベースのシステム、そしておそらくdebianベースのシステムも想定しています)には、ユーザーが所有するtmpfsが_/run/user/1000/_に自動的にマウントされています

チェックするには_df -T_を使用します。

 11:41:11 jesse @ Limbo:〜$ df -T 
ファイルシステムタイプ1Kブロック使用可能使用可能%マウント
 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
なしtmpfs 5120 0 5120 0%/run/lock
なしtmpfs 15920584 848 15919736 1%/run/shm
なしtmpfs 102400 12 102388 1%/ run/user
/dev/sdb3 ext4 100861352 90755700 4959136 95%/mnt/data

_/run/user/_の下には、システム上の各通常ユーザー用のディレクトリがあります

_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
_

これらのディレクトリの名前は、それぞれのユーザーのIDに基づいています。 _id -u_でユーザーIDを取得できます。このコマンドの詳細については、_man id_を参照してください。

_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
_

次に、mktempコマンドと_--tmpdir_オプションを使用して、このtempfilesystemに一時ファイルとディレクトリを作成し、RAMに一時ファイルを作成します。

与えられたアドバイスに従って ここ 最初に一時ディレクトリを作成してから、その中に一時ファイルを作成します。

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

一時ディレクトリを作成するには_/run/user/1000/bash.w42BYxbG/_します

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

その中に一時ファイルを作成します。

_rm -r $mydir_を実行するだけなので、これらのファイルを簡単にクリーンアップできます。

デフォルトでは、これらのファイルはすべて、それらを作成したユーザーだけが所有し、読み取ることができます。

注:コマンドの$(basename $0)部分は、mktempを実行したスクリプト/プロセスの名前を抽出します。スクリプト_/home/jesse/scripts/myScript.sh_がある場合、$(basename $0)は、このスクリプトによって実行されると_myScript.sh_を返します。したがって、上記のコマンドはそれぞれ_/run/user/1000/myScript.sh.w42BYxbG/_および_/run/user/1000/myScript.sh.w42BYxbG/myScript.sh.BCzSmq06_を作成します。

私が理解しているように、目標は次のとおりです。(1)do反転したファイルをディスクに保存し、ブラウザに提供します(注:これはtmpfsなど、他のすべての回答はすでに詳しく説明しています);ただし、(2)最初のtmpファイルをディスクに書き込まず、元の出力を使用します。それでも、(3)元の出力をstdoutに表示します。

その場合、次のように bashプロセスの置換 (つまり、基本的に名前付きパイプ)を使用して、ニーズを満たす可能性があります。

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

これは継続的に出力をstdoutに出力することに注意してください。コマンドが終了すると(ループが終了すると)、その出力が反転され、出力ファイルに書き込まれます。次のように示され、1秒あたり1行を出力し、終了後、ファイル/tmp/foo.txtには、反転した行が含まれています。

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