如何在RAM中创建临时文件?

如何在RAM中创建临时文件?

我有一个脚本将其输出传输到|tee scriptnameYYMMDD.txt.在生成输出的 for 循环的每个循环之后,我将反转文件内容,以便tac scriptnameYYYYMMDD.txt > /var/www/html/logs/scriptname.txt日志输出在浏览器窗口中可见,最新行位于顶部。

我将有几个脚本并行执行此操作。我正在尝试最大限度地减少磁盘活动,因此|tee scriptnameYYYYMMDD.txt最好将输出输出到 RAMdisk。mktemp在文件夹中创建一个文件/tmp,但该文件似乎不在磁盘外。

答案1

您可以安装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

答案2

通过调查以前的答案和该问题中的信息发现了以下答案这里没有他们就不会被发现。感谢他们。

在我的 linuxmint 系统上(我假设大多数基于 ubuntu 的系统,也可能基于 debian),有一个用户拥有的 tmpfs 自动安装在/run/user/1000/

用于df -T检查。

11:41:11 杰西@Limbo:~$ df -T
文件系统类型 已用 1K 块 可用 使用% 安装于
udev devtmpfs 15904812 4 15904808 1% /dev
tmpfs tmpfs 3184120 1700 3182420 1% /运行
/dev/sdb2 ext4 14248880 11464788 2037240 85% /
无 tmpfs 4 0 4 0% /sys/fs/cgroup
无 tmpfs 5120 0 5120 0% /运行/锁定
无 tmpfs 15920584 848 15919736 1% /run/shm
无 tmpfs 102400 12 102388 1% /运行/用户
/dev/sdb3 ext4 100861352 90755700 4959136 95% /mnt/数据

下面/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查看man id此命令的详细信息来获取用户 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在此临时文件系统中创建临时文件和目录,从而在 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

答案3

使用 Ubuntu 试试这个:

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

答案4

据我了解,目标是:(1)将反转的文件存储到磁盘,以提供给浏览器(注意:这可能是 tmpfs 等,因为所有其他答案已经详细说明);但是,(2) 避免将第一个 tmp 文件与原始输出一起写入磁盘;然而,(3) 仍然将原始输出显示到标准输出。

如果是这样,那么以下内容可能会满足您的需求,使用bash 进程替换(即基本上是一个命名管道):

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

请注意,这是连续将输出打印到 stdout,并且当命令结束时(当循环终止时),反转该输出并将其写入输出文件。如下图所示,每秒打印一行,终止后文件/tmp/foo.txt包含相反的行:

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

相关内容