出力を|tee scriptnameYYMMDD.txt
にパイプするスクリプトがあります。出力が生成されるforループの各サイクルの後、tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt
を使用してファイルの内容を逆にし、最新の行が一番上にあるブラウザーウィンドウにログ出力が表示されるようにします。
これを並行して実行するいくつかのスクリプトを用意します。私はディスクアクティビティを最小限にしようとしているので、|tee scriptnameYYYYMMDD.txt
からRAMdiskへの出力が最適です。 mktemp
は/tmp
フォルダーにファイルを作成しますが、それはディスク外ではないようです。
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
Ubuntuでこれを試してください:
ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"
次の回答は、以前の回答とこの質問の情報 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 )