问题描述
/tmp目录如何清理?它是自动的吗?如果有,清理的频率如何?
最佳解决方案
注意!至少从Ubuntu 14.04开始,这个答案已经过时了。查看目前情况的其他答案,如果他们证明是正确的,那么他们会疯狂地向上投票。也发表评论,所以我可以把链接放在当前正确的答案。
2011年的旧答案:
/tmp的清洁由新贵脚本/etc/init/mounted-tmp.conf完成。每次安装/tmp时,该脚本都由新贵运行。实际上这意味着每次启动。
该脚本的内容大致如下:如果/tmp中的文件比$TMPTIME天早,则会被删除。
$TMPTIME的默认值为0,这意味着/tmp中的每个文件和目录都被删除。 $TMPTIME是/etc/default/rcS中定义的环境变量。
次佳解决方案
默认情况下,每次启动时目录都会被清除,因为TMPTIME默认为0。
在这里您可以更改以下文件中的时间:
/etc/default/rcS
TMPTIME表示tmp应该在几天内清除多久
第三种解决方案
尽管/tmp文件夹不是用于存储文件long-term的地方,但有时候您希望保留的时间比下次重新引导时长一些,这是Ubuntu系统上的默认设置。我知道一两次我在测试期间向/tmp下载了一些东西,在进行更改后重新启动,然后又丢失了原始数据。如果您想保留/tmp文件的时间更长,可以更改此设置。
更改/tmp清理频率
系统重启时清除/tmp的默认设置保存在/etc/default/rcS文件中。我们将看到的价值是TMPTIME。
TMPTIME=0的当前值表示在重新启动时删除文件,尽管该文件的年龄。将该值更改为不同的(正数)值将改变文件在/tmp中的存活天数。
TMPTIME=7
此设置将允许文件在/tmp中保留一周,然后在下次重新启动时删除它们。负数(TMPTIME=-1)告诉系统不要删除/tmp中的任何内容。这可能不是你想要的,但可用。
第四种方案
在Ubuntu 14.04中,这由tmpreaper完成,每天由cron调用(来自/etc/cron.daily)。该程序可以通过/etc/default/rcS和/etc/tmpreaper.conf进行配置。
第五种方案
我在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”。这是我最大的努力,那个手册页几乎无法透露细节。
新安装程序的优点是,即使系统未重新启动,文件清理程序仍可以运行(例如始终启动服务器)。我认为这是一大优势。
第六种方案
14.04之前:
每次重新启动时都会清理它。
第七种方案
在运行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服务器,我们不希望重启它,原因很明显。
第八种方案
在systemd Ubuntu(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在关机时运行,否则每天运行一次。清理的文件可以使用another answer中提到的/etc/tmpfiles.d进行扩展。
您可以使用systemctl edit systemd-tmpfiles-clean.timer更改计时器行为本身,并使用各种systemd Timer配置选项(请参阅man 5 systemd.timer)。
参考资料