/ tmp是否保证存在?


42

/tmp在写入其中的文件之前,我需要检查并创建吗?假设没有人跑过,sudo rm -rf /tmp因为那是非常罕见的情况


16
“保证”是什么意思?FHS要求使用它,因此任何符合FHS的发行版都需要它。但是,有许多不符合FHS的特殊用途发行版。没有/ tmp的情况下创建Unix / Linux发行版当然是可能的,但是您是否需要完全关心它取决于您是否关心支持这些系统。
Lie Ryan

1
为什么不创建自己的临时目录并在完成后将其删除,而不是依靠下一次重新启动进行清理?
WGroleau '17

4
@WGroleau我不了解OP,但是在为自己的系统编写的脚本上,我通常将临时文件放在/tmp(使用创建的mktemp)子目录中,然后在退出时删除该子目录。我的大部分系统都是只读安装的,这使我不必记住cd已写入可写目录的位置
Fox

1
@WGroleau我不依靠重启来清理它。在mktemp看起来真的很棒,i'l可能最终使用。
Ayush

7
@jamesqf是的,不需要重新启动即可清除/tmp。但是,相反,允许这样做,并且大概是WGroleau推断的距离太远了。我/tmptmpfs在RAM中,所以它得到在关机时清除。尽管如此,这仅仅是系统的细节,FHS并不能保证。因此,原来的意见,这是愚蠢的依赖存在不存在的任何东西/tmp靴之间。
underscore_d

Answers:


60

FHS是任务/tmp存在,如同POSIX所以你可以依靠它在那里(至少在兼容的系统,但实际上它几乎是保证是出现在类Unix系统)。但是您不应该:系统管理员或用户可能更喜欢其他位置存放临时文件。有关更多详细信息,请参见在多个平台上查找正确的tmp目录


这当然是设计失败。/tmp是一个名字。$TMPDIR是另一个名字。如果不能指望/tmp临时目录的正确名称,那么为什么可以指望$TMPDIR正确的环境变量的名称呢?我为什么不检查一下变量$TMPDIRVAR的名称?间接的一种级别就足够了,而 事实就是这样。它没有说什么有关实际存储,只是一个名字。/tmp
MSalters

@MSalters不仅限于此。在命名空间之前,$TMPDIR允许每个用户拥有一个单独的临时目录,甚至允许不同的临时目录用于不同的程序;单个/tmp不提供此功能(再次,没有名称空间或类似名称)。还有很多历史(或遗产)需要考虑。
史蒂芬·基特

每个用户都是一个有效的观点,但这就是为什么要使用一个好的设计的原因~/tmp/tmp当然,该位置可能仍与相同。
MSalters

44

实际上,/tmp几乎可以保证存在。但是,即使它存在,也不意味着您应该在其中放置临时文件。

标准惯例是使用TMPDIR环境变量。如果存在,则指向临时文件的目录。如果不存在,请将临时文件放在中/tmp

在Shell脚本中,您可以将其"${TMPDIR:-/tmp}"用作临时文件位置:TMPDIR如果设置为¹,则扩展为,/tmp否则为。或者,您可以TMPDIR使用以下命令有条件地设置以防万一

: "${TMPDIR:=/tmp}"

然后在其中创建临时文件"$TMPDIR"

请注意,任何应用程序都可以在/tmp或下创建文件$TMPDIR。此外,该目录可能在用户之间共享,因此在创建文件时需要注意权限。许多系统(Linux,* BSD)都有一个命令mktemp,可以在正确的目录中安全地创建文件。通常mktemp,创建临时文件和目录是一个好主意-尤其是从Shell脚本中,由于存在符号链接攻击,因此无法在共享目录中安全地创建文件(mkdir如果正确处理错误,这很好)。

¹ 并且非空-如果变量为空,则无论如何都无法使用,并且通常建议将空变量或未设置的变量包含文件名,以相同的方式处理它们。


11
也许您会提到用户必须期望文件名冲突。因此,IMO唯一推荐的在/ tmp中创建文件的方法是命令,mktemp并且该命令也应自动处理$
TMPDIR。– rudimeier

这是您想要的答案。我见过没有/ bin的系统,更不用说/ tmp了。
约书亚

1
此外A.10目录结构和设备状态:...该/tmp目录保留在POSIX.1-2008以适应假定其可用性历史的应用程序。鼓励实现在环境变量中提供适当的目录名称,TMPDIR并鼓励应用程序使用的内容TMPDIR来创建临时文件。...
Andrew Henle

3
只是难过地发现,mktemp是不是在POSIX,虽然它已经在最流行的操作系统,如GNU(Linux的)OpenBSD的FreeBSD的,和Mac系统
富兰克林于

1
可能值得补充的是mktemp,类似的函数可用于许多脚本和编程语言,例如libcPerlPython
加拉夫

6

尽管它很可能存在,但您应该检查另一个原因:它不能保证很大。在许多系统上,它/tmp是由RAM(而不是磁盘)支持的,并且可能限制为几个GB。(在Fedora系统上,默认情况下为RAM的一半。)因此,您不仅应检查是否存在,还应检查是否有放置所需内容的空间。

如果尺寸较大,请使用/var/tmp/


2
我不确定在继续之前检查是否可用空间是“ Unix方式”,尤其是因为并非总是确切知道您将需要多少空间。在任何情况下,您都必须准备好妥善处理写错误,以防文件系统变满。如果您要这样做,那么通过进行预先检查而容易产生假阴性和阳性的检查有什么好处?
Nate Eldredge

2
我想这取决于您如何处理故障情况。要点是不要假定/tmp可以处理大文件。假设通过中速链接下载了10GB。不论是否采用“ Unix方式”,要找出几个小时的时间都无法正常工作是很可悲的。
mattdm '17

1
@mattdm尽早检查是不错的方法,但必须处理故障。也许/ tmp在下载开始时确实有10 GB可用空间,但是在下载运行时,另一个用户将5 GB复制到其中。怎么办?嘿。
Zan Lynx'5

绝对!我并不是说这是不处理失败的借口。
mattdm '17

“如果您有大件东西”-使用/ tmp并在需要时让操作系统交换。
UKMonkey
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.