/ tmp目录如何清理?


300

如何/tmp清理目录?它是自动的吗?如果是这样,它多久清理一次?


15
我的临时文件永远不会写入磁盘。它们被写入RAM磁盘。我确实放tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0了/ etc / fstab。
匿名

Answers:


192

注意!从至少ubuntu 14.04开始,此答案已过时。查看当前情况的其他答案,如果证明正确,则大肆投票。还要发表评论,这样我就可以在此处链接到当前正确的答案。

对于14.04,请参见https://askubuntu.com/a/759048/1366

对于16.10,请参见https://askubuntu.com/a/857154/453746


2011年的旧答案:

清理/tmp工作由upstart脚本完成/etc/init/mounted-tmp.conf。每次/tmp安装时,脚本由upstart运行。实际上,这意味着每次启动。

该脚本大致执行以下操作:如果文件中的文件/tmp早于$TMPTIME几天,它将被删除。

默认值为$TMPTIME0,这意味着/tmp将删除其中的每个文件和目录。$TMPTIME是在中定义的环境变量/etc/default/rcS


14.04不再适用(该脚本不再存在)。
MartinSchröder'16

@MartinSchröder-该脚本存在于我的系统上,它是14.04的全新安装,并且tmpreaper不存在!
Lance Holland

我现在正在使用Arch Linux,因此无法验证。抱歉。请有人对此进行验证并评论或编辑我的答案。
lesmana '16

4
在ubuntu 16.04中,tmpreaper因不安全而被放弃,请参阅:fossies.org/linux/tmpreaper/debian/README.security
tamerlaha

1
不可以。在Ubuntu 16.04中,它只是被系统化机制所取代。阅读该文档,您会发现实际上是对为什么声称不安全的安全分析存在缺陷的解释。
JdeBP

141

默认情况下,每次引导时都会清除该目录,因为TMPTIME默认情况下为0。

您可以在以下文件中更改时间:

/etc/default/rcS

TMPTIME 表示几天内清除tmp目录的频率


9
对于从不重启的机器(例如服务器),每次启动时清除都不理想。我的/ tmp中有超过500,000个文件占用5 Gb空间,因为我的服务器具有378天的正常运行时间。我不愿意重新启动它,只是因为重新启动时清除这些文件需要花费数小时。
rjmunro 2012年

10
在您的情况下,您应该给tmpreaper个机会。
qbi

1
CRON工作可以轻松解决该问题。
肯·夏普2014年

tmpwatch应该是一个合适的工具。
ArekBulski

1
看来Ubuntu / systemd已经提供了解决方案。我会说更多,但是...。
肯·夏普

65

虽然该/tmp文件夹不是长期存储文件的位置,但有时您希望将其保留的时间比下次重新引导的时间长一点,这是Ubuntu系统上的默认设置。我知道/tmp在测试过程中有一两次,我已经下载了一些东西,进行更改后重新启动,然后又丢失了原始数据。如果您想将/tmp文件保留更长的时间,可以更改此设置。

更改/tmp清理频率

该文件中包含告诉您的系统/tmp在重新引导时清除的默认设置/etc/default/rcS。我们将看的值是TMPTIME

TMPTIME=0不管文件的使用期限如何,在重新引导时删除文件的当前值。将此值更改为其他(正)数字将更改文件可以生存的天数/tmp

TMPTIME=7

此设置将允许文件保留/tmp到一个星期之前,然后在下次重新启动时将其删除。负数(TMPTIME=-1)告诉系统不要删除中的任何内容/tmp。这可能不是您想要的,但是可以使用。


1
很好的解释。但是cleanup命令在哪个脚本中?我已经看到了/etc/init/mounted-temp.conf,但是它的线条start on mounted MOUNTPOINT=/tmp使我认为它不适用。
enzotib 2011年

7
如果您不希望自动删除文件,请放入/var/tmp而不是/tmp
吉尔斯

1
当计算机崩溃(可能是由于OOM)而导致您不希望丢失的文件(渲染的视频帧)时,保留文件也很方便。当然,更好的解决方案是解决问题。:-)
肯·夏普

可以在Cygwin内部完成吗?
CMCDragonkai 2014年

46

我正在Ubuntu 16.10上进行检查。我可以证明,编辑/ etc / default / rcS根本不再起作用,并且无论您放入该文件什么内容,tmp中的文件都会通过重新启动来清除。正如其他人提到的那样,不再使用tmpreaper。

我认为正确的答案是Ubuntu 16.10具有新的设置。在手册页“ tmpfiles.d”中有一个文件夹/etc/tmpfiles.d。在该文件夹中,应该放置一个配置文件来控制是否要删除/ tmp。这是我要停止重启以擦除/ tmp中的文件的方法,除非它们已经存在20天了:

#/etc/tmpfiles.d/tmp.conf

d /tmp 1777 root root 20d

如果您不想删除文件,请用“-”替换“ 20d”。这是我的最大努力,手册页几乎没有细节。

新设置的优点是,即使不重新引导系统,文件清理器仍可以运行(例如始终在服务器上)。我认为这是一大优势。


5
man tmpfiles.d
MartinSchröder17年

我发现您可以使用连字符保留原始文件的权限和所有者:d /tmp/ - - - 20d
Dave Yarwood

2
同样值得注意的是:您可以通过手动运行清理作业来测试配置:systemctl start systemd-tmpfiles-clean
Dave Yarwood

@ pauljohn32是否也适用于16.10之后的版本?
kapad

3
@kapad:我刚刚验证了它也可以在Ubuntu 18.04上运行。
Gene Vincent

26

在Ubuntu 14.04中,此操作是通过进行的tmpreaper,每天cron(from /etc/cron.daily)都会调用它。该程序可以通过/etc/default/rcS和配置/etc/tmpreaper.conf


在我的系统上,tmpreaper不在/etc/cron.daily中,但是我能够使用apt-get安装它
Joe Germuska

10

在14.04之前:

每次重新启动时都会清理一次。


出现14.04+版本时,它仅使用tmpreaper,而不使用“每次启动”脚本FWIW
rogerdpack

我的14.04系统都在重新启动时清理。从未听说过tmpreaper
肯·夏普

如果您从不重启系统怎么办?
phuclv

7

systemdUbuntu(15.10及更高版本)中,这是通过systemd使用systemd-tmpfiles-clean服务和计时器来完成的:

$ systemctl cat systemd-tmpfiles-clean.service 
# /lib/systemd/system/systemd-tmpfiles-clean.service
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-sync.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

$ systemctl cat systemd-tmpfiles-clean.timer  
# /lib/systemd/system/systemd-tmpfiles-clean.timer
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

因此systemd-tmpfiles-clean在关机时运行,否则每天运行一次。可以使用另一个答案中/etc/tmpfiles.d提到的扩展扩展清理的文件。

您可以使用systemctl edit systemd-tmpfiles-clean.timer和使用各种systemd Timer配置选项来更改计时器行为本身(请参阅参考资料man 5 systemd.timer)。


我将计时器更改为20分钟,并且看到状态命令显示它实际上正在使用20分钟配置。但我的问题是/tmp仍然没有清理。我需要将其清理干净。即使手动启动sudo systemctl start systemd-tmpfiles-clean也无法解决问题。有什么想法吗?
user2932688

5

在运行Ubuntu的一台服务器上,我们有一个脚本来删除/ tmp中的文件,并且该脚本每晚运行一次。

脚本是:

#!/bin/sh
# Clean file and dirs more than 3 days old in /tmp nightly

/usr/bin/find /tmp -type f -atime +2 -mtime +2  |xargs  /bin/rm -f &&

/usr/bin/find /tmp -type d -mtime +2 -exec /bin/rm -rf '{}' \; &&

/usr/bin/find /tmp -type l -ctime +2 |xargs /bin/rm -f &&

/usr/bin/find -L /tmp -mtime +2 -print -exec rm -f {} \;

只需将上面的内容保存到文件chmod 775中,然后创建一个cron条目即可运行它。由于这是Web服务器,出于明显的原因,我们不想重新启动它。


6
使用tmpwatch可能会更好。
poolie 2011年

9
最后一行非常危险。通常情况下,每个人都可以跑ln -s /usr /tmp/kaboom甚至跑ln -s /* /tmp/...
Daniel Alder
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.