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)
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 -u
see获取用户 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
。
Cyr*_*rus 15
用 Ubuntu 试试这个:
ramtmp="$(mktemp -p /dev/shm/)"
tac scriptnameYYYYMMDD.txt > "$ramtmp"
Run Code Online (Sandbox Code Playgroud)