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

use*_*145 40 filesystems scripting shell-script tmp files

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

我将有几个脚本并行执行此操作。我正在尝试最小化磁盘活动,因此|tee scriptnameYYYYMMDD.txt最好从RAMdisk输出。mktemp/tmp文件夹中创建一个文件,但它似乎不在磁盘上。

cha*_*aos 34

您可以挂载一个tmpfs分区并在那里写入文件:

mount -t tmpfs -o size=500m tmpfs /mountpoint
Run Code Online (Sandbox Code Playgroud)

此分区现在限制为 500 MB。如果您的临时文件大于 500 MB,则会出现错误:no space left on device. 但是,当您指定的空间量大于系统 RAM 的空间量时,这并不重要。tmpfs也使用交换空间,因此您不能强制系统崩溃,而不是ramfs.

您现在可以将文件写入/mountpoint

command | tee /mountpoint/scriptnameYYYYMMDD.txt
Run Code Online (Sandbox Code Playgroud)

  • `size=[num]%` 也很好 - tmpfs 可以限制为可用内存的百分比。如果命令并不总是针对同一台 *(real/virtual)* 机器,那么这种方式通常会更容易。同样方便的是,tmpfs 不会删除带有`-o remount,size=newsize` 的内容。 (3认同)
  • 由于问题围绕着一个 bash 脚本,我们没有理由假设它是由 root 运行的,您能否指定是否可以绕过 `mount` 不允许非 root 用户使用 `-t` 或 `-o`?也就是说,如果系统上不存在合适的文件系统,如何构建使用 `tmpfs`(或任何其他方式的 RAM)来节省磁盘操作的脚本? (2认同)
  • 不好回答。如果你不是 root 会失败。 (2认同)

Jes*_*rer 16

以下的答案被调查以前的答案,并在这个问题上的信息发现,这里并不会被发现,没有他们。给他们点赞。

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

使用df -T检查。

11:41:11 jesse@Limbo:~$ df -T
文件系统类型 1K-blocks Used 可用使用% Mounted on
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% /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
Run Code Online (Sandbox Code Playgroud)

这些目录以其各自的用户 ID 命名。我们可以使用id -usee获取用户 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
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用mktemp带有--tmpdir选项的命令在这个临时文件系统中创建临时文件和目录,从而在 RAM 中创建临时文件。

按照此处给出的建议我首先创建一个临时目录,然后在其中创建我的临时文件:

mydir=$(mktemp -dt "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u))
Run Code Online (Sandbox Code Playgroud)

/run/user/1000/bash.w42BYxbG/然后创建一个临时目录

myfile=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=$mydir)
Run Code Online (Sandbox Code Playgroud)

在其中创建一个临时文件。

这使得清理这些文件变得容易,因为我所要做的就是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

  • 在 mktemp 上使用 mkstemp !!原因来自:https://linux.die.net/man/3/mktemp :在 Bugs 部分“...每次使用 mktemp() 都是安全风险,mkstemp(3) 避免了竞争。” (3认同)
  • `/run/user/1000` 在每个使用 systemd 的 linux 上都可用,所以它不仅在基于 debian 的系统上可用,而且在大多数其他 linux 发行版上也可用。如果没有,则应使用 /tmp 代替。您可以使用变量 $XDG_RUNTIME_DIR 来简化您的命令,该变量已经为每个用户保存了正确的目录。有关更多信息,请查看例如这个答案:https://unix.stackexchange.com/questions/162900/what-is-this-folder-run-user-1000 (2认同)

Cyr*_*rus 15

用 Ubuntu 试试这个:

ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"
Run Code Online (Sandbox Code Playgroud)

  • 写入`/run/shm/` 的稳定性如何?如果需要,我可以将 `chmod` 更改应用到临时文件吗?我注意到文件夹的模式位与 `/tmp` 文件夹相同。谢谢。 (3认同)
  • 至于其他目录,由`mktemp`在`/run/shm`(符号链接到`/dev/shm`)中生成的文件也有一个默认权限`-rw--------`(600),你如果需要,可以使用“sudo chmod”更改它。 (2认同)