如何清理 /tmp 目录?

rizhas@rizhas-laptop:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda7        67G   58G  5,2G  92% /
none            4,0K     0  4,0K   0% /sys/fs/cgroup
udev            1,5G   12K  1,5G   1% /dev
tmpfs           303M  1,2M  302M   1% /run
none            5,0M     0  5,0M   0% /run/lock
none            1,5G  348K  1,5G   1% /run/shm
none            100M   80K  100M   1% /run/user
overflow        1,0M  1,0M     0 100% /tmp
overflow        1,0M  1,0M     0 100% /tmp

如何清理/tmp目录?

1可能在Unix & Linux上已经回答了。不确定这是否使得这个问题成为重复的。 - drc
不是,@drc,但是找得不错。我用那里的链接更新了我的答案。 - Rinzwind
1另请参阅如何清理 /tmp 目录? - Martin Schröder
相关链接:https://unix.stackexchange.com/questions/11235/is-it-safe-to-rm-rf-tmp | https://superuser.com/questions/499039/how-to-cleanup-tmp-folder-safely-on-linux - Ciro Santilli OurBigBook.com
9个回答

/tmp应该在重新启动时清理,但如果您不重新启动(这在服务器上很正常),清理将不会发生。 find /tmp -ctime +10 -exec rm -rf {} + 将删除所有超过10天的文件和文件夹。 您可能希望将其添加到每日计划任务中。

更新

在下面的评论中,@sfussenegger建议使用稍微不同的命令格式,这可能更适合您的需求和您正在操作的系统。

sudo find /tmp -type f -atime +10 -delete

这里的命令使用sudo来确保删除所有内容(或者您可以以root身份运行它),操作超过10天没有被访问的文件,并且只删除文件,而不是文件夹。它还使用-delete来避免执行rm命令。


3在进行文件系统操作时,如果你需要使用文件的时间信息,可以考虑使用访问时间(-atime)而不是创建时间(-ctime)。当然,这仅适用于文件系统保留了访问时间的情况下(请检查/etc/fstab中是否存在noatime选项)。 - sfussenegger
9好的,请给我一点时间,但还有一件事情:您只想搜索文件 (-type f)。否则,您可能会发现一个目录树的父级在很长时间内没有被访问,并删除其中所有可能仍在使用中的内容。所以我建议的最终命令是 sudo find /tmp -type f -atime +10 -delete - sfussenegger
2@sfussenegger,也许你可以将你的评论提升为一个回答?我认为这样比在评论中“隐藏”要好。 - Jonathan
sudo find /tmp -type f,s -atime +10 -delete 可以用来删除套接字文件。 - Christian Toffolo

你可以假设tmp目录(/tmp/ /usr/tmp等)中的任何内容都可以被删除。在开始删除之前,停止使用所有程序和服务,因为/tmp/可以被程序用于临时存储该会话的信息。所以如果有mysql和/或apache运行,请执行sudo service mysql stopsudo service apache2 stop。 /tmp/目录中文件的名称大多数情况下可以提示它们属于哪个程序。
因此,从命令行操作...
cd /tmp/
pwd
sudo rm -r *

将清空 /tmp/ 目录并删除所有文件和子目录。请小心正确输入命令。其中的 pwd 命令不是必需的,但应显示 /tmp
如果您希望以交互方式执行(需要确认删除):
cd /tmp/
sudo rm -ri *

值得注意的是,重新启动会清除/tmp目录,如此所示:如何清理/tmp目录?因此,如果重新启动后/tmp/中有很多文件,您需要调查这些文件的来源。
我还想指出,对于/tmp来说,1 Mb的空间并不多。您是否在使用MySQL?请参考https://unix.stackexchange.com/a/76058/10017以了解如何解决此问题(感谢@drc)。

2“没有任何损害”只适用于上次重启之前的文件。否则,它可能被当前程序使用,并且(对于该程序而言)可能会引起问题...例如,我有一些脚本在/tmp目录下创建文件,然后重新读取这些文件进行下一步处理。在此期间删除/截断它们将中断程序的操作(甚至可能导致危险结果,具体取决于这些文件的用途) - Olivier Dulac
...所以使用who -b(上次启动的日期),然后创建一个在启动时日期为/boottime的文件(touch ....... /boottime),将允许我们安全地执行find /tmp -type f \( ! -newer /boottime \) -delete \;命令,只删除比上次启动时间更早的文件。 - Olivier Dulac
我可以使用这些评论来扩展答案吗?请注意:这里的 /tmp 可能来自于 mysql。 - Rinzwind
4作为一个经常在我的脚本中使用mktemp的人,我强烈不同意"没有任何伤害"的说法。 - hytromo
@Rinzwind: 没问题 :) 我在你的回答中提到了这点,是为了补充完整(并修正关于“伤害”的说法)。 - Olivier Dulac
4如果/tmp文件夹内有任何比上次重启时间更早的文件,那么启动脚本没有完成它们的工作。 - Simon Richter
哦,天啊。也许是我自己的问题,但我不想在我的.bash_history中出现任何sudo rm -r *的记录。或者我的剪贴板上,实际上任何地方都不想有这样的记录。也许可以考虑使用sudo rm -r /tmp/* - bers
想象一下,有人将上述的两行或三行代码复制粘贴到一个已经输入了其他内容的终端中。它基本上会运行 foocd /tmp,然后继续清理当前工作目录。毛骨悚然 - bers

tmpreaper程序可以定期清理/tmp目录。该程序会删除在给定时间段内未被访问的所有文件,通常为两周。为了使其正常工作,所在的文件系统应启用atimes选项。如果您使用的是tmpfs,看起来您应该没问题。
当然,重新启动也会清空/tmp,但那样太无聊了。

我对Ubuntu和Debian中没有这个标准选项感到惊讶。对我来说,相对非特权用户进程填满/tmp是相当常见的情况。 - sage
1是的,但这是一个需要由系统管理员设置的策略。如果您有长时间运行的服务,希望保留其数据,除了“不清理”之外的任何默认设置都可能是危险的。 - Simon Richter

目录/tmp表示临时。

该目录存储临时数据。您不需要删除其中的任何内容,其中包含的数据在每次重新启动后会自动删除。

但是,如果您想删除其中的数据,请使用

sudo rm -r /tmp/*

从中删除不会造成任何问题,因为这些都是临时文件。


18它们在临时意义上是指在重新启动后不再需要,但并不意味着它们现在不需要或者在5分钟后不会需要。 - Daniel Serodio
9这个“不会有任何问题”的说法是不正确的。在我还不了解情况之前,我曾经做过一次类似的操作,结果基本上把我的机器搞糟了。 - Kyle Strand
另请参阅http://unix.stackexchange.com/q/11235/38050 - Kyle Strand

在运行像 rm -r ./* 这样的命令之前要小心。一旦运行,将非常难或不可能恢复任何数据。

所有内容都将被删除。 确保您要删除的目录是正确的。

有一种更安全的处理方式。

# sudo rm -r /tmp/*

这样,当你在shell中意外运行这个命令 history 时,它不会删除错误的文件(除非你把它们保存在 /tmp 中)。

默认情况下,每次启动时都会清除/tmp目录,因为TMPTIME默认为0

如果您的Linux文件系统上的“/tmp”挂载为溢出(通常大小为1MB),这很可能是因为您没有将“/tmp”指定为自己的分区,导致根文件系统填满并重新挂载“/tmp”作为备用。在您清理了空间之后,只需卸载备用挂载点,它应该会重新挂载到原始位置。
sudo umount overflow

如果设备正在忙,请使用

sudo umount -l overflow

使用内置的tmpfiles.d而不是。 查看这个答案: https://askubuntu.com/a/857154/453746

我认为正确的答案是Ubuntu 16.10有一个新的设置。有一个文件夹/etc/tmpfiles.d,在"tmpfiles.d"的man页面中有文档。在那个文件夹中,应该放置一个配置文件来控制是否要清除/tmp。这就是我阻止重新启动时清除/tmp中的文件,除非它们已经存在20天的方法:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d 如果你永远不想删除文件,请将"20d"替换为"-"。这是我最好的努力,那个man页面几乎无法理解。


这是对我有效的方法:
sudo reboot
在一个失控的进程通过/tmp目录填满我的驱动器后,我也考虑过使用rm -rf /tmp/*,但最终我选择了重启,结果发现根目录的df命令显示的占用空间从99%降到了77%。
又一次验证了那句老话:“你试过关掉然后再打开吗?”