作为开发人员,我应该为中间文件写入哪个文件夹?


17

我开始为我的项目编写一些bash脚本,它们需要编写一些中间文件或变量。

我想知道当某人运行我的脚本时可以确定可以访问哪些文件夹吗?这是一种常见的做法/tmp/吗?还是我应该使用其他东西?

Answers:



15

如果您需要编写一些仅在脚本或应用程序运行时才持续的临时文件,请使用TMPDIR环境变量指示的目录,或者如果未定义该变量,则使用/tmp

/tmp在某些系统上的引导时会被清除(有时甚至在RAM中,例如在Solaris上,默认情况下,在某些Linux安装中也是如此),因此它不能用于必须在断电或重新引导后仍然存在的文件。/var/tmp可以用于必须在重新启动后仍然存在的文件,但系统管理员可能会不时清理这些文件。如果您的应用需求,以节省永久基础上的文件,他们的某处写在用户的主目录(~/.programmingnoobsapp~/.cache/programmingnoobsapp)或下/var/lib/programmingnoobsapp/var/cache/programmingnoobsapp

请注意,这/tmp是所有用户共享的,因此在此处创建文件时需要采取预防措施。您需要选择一个尚不存在的文件名,并且要小心,避免出现竞争状况,即另一个进程会以不同的权限在您之前创建文件,这可能是一个安全漏洞(如果另一个进程存在的话)以其他用户身份运行,然后可以访问和修改您的流程数据)。使用mktemp命令在/tmp或中创建文件/var/tmp。默认情况下,在中mktemp创建文件$TMPDIR/tmp如果TMPDIR未设置,通常在正确的位置。如果您需要使用多个临时文件,或者甚至只需要一个,我建议使用以下命令为所有临时文件创建目录:mktemp -d 并在脚本末尾将其删除。

#!/bin/sh
tmp_root=
trap 'rm -rf "$tmp_root"' EXIT INT TERM HUP
tmp_root=$(mktemp -d)
tmpfile1=$tmp_root/file1
tmpfile2=$tmp_root/file2
…

对于mktemp,我不会在脚本末尾删除临时文件。我有一个tmpwatch cron作业,该作业会自动删除旧文件。在大多数情况下,我不会读取中间文件,系统会自行删除文件。但是,如果脚本出了问题,我将保留所有中间文件以便于调试。
emory

1
为+1 mktemp。对我来说,这是正确的答案:将安全创建临时文件的任务委托给mktemp(请参阅本文)。尽管引用一个答案FHS也具有很大的价值。
卡洛斯·坎德罗斯(CarlosCampderrós)

为什么要tmp_root在分配之前进行初始化?这不是更自然unset吗?
l0b0

@ l0b0都可以使用(在下除外set -u,但这并不常见)。设置陷阱之前,必须将其(取消)设置为安全值,以防脚本在设置陷阱后立即被杀死。
吉尔(Gilles)'所以

我要添加,set -o errexit以使如果tmp_root在环境中已将其设置为只读,则不会破坏错误的目录...
l0b0

2

只是为了补充到目前为止已经发布的答案。

也有/dev/shm一些Linux发行版可以是使用了临时存储。仅在考虑/dev/shm使用tmpfs文件系统的情况下,文件I / O的性能是关键因素时才应使用此存储。此外,还应将其用于合理大小的文件和数据。该tmpfs文件系统利用系统RAM作为存储,因此它在启动之间并不持久。

在题为“ / tmp vs./dev/shm”的Linux上的临时文件存储中,在StackOverflow上提到的所有选择都有很好的概述。在标题为:何时应该使用/ dev / shm /以及何时应该使用/ tmp的超级用户问答中对此进行了很好的介绍

参考文献


0

是的,/tmp主要用于临时需要的文件。/ tmp具有粘性位,这意味着只有项目的所有者,目录的所有者或超级用户才能重命名或删除文件。许多程序使用它来创建锁定文件和临时存储数据。在某些发行版中,此目录在启动或关闭时被清除。


1
并非在启动时清除所有/ tmp目录。例如,默认的AIX安装没有(这是UNIX&Linux,而不仅仅是Linux)。
AugustBitTony13年

但是,如果它是“内存”常驻程序(在许多情况下似乎是默认值),则当系统出于任何原因停止运行时,它就会消失。
mdpc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.