我们是否应该手动删除/ tmp的内容?


26

我的印象是其中的“旧”文件/tmp将被定期删除。但是,在我看来,/tmp只要需要,它就会增长,并且什么也不会删除。有人说,最好/tmp仅在磁盘已满时才留下并删除其内容。

我的问题是,/tmp真的设计成不能自理吗?最佳做法是什么?


1
通常/tmp在重新启动后会被清除,但这取决于安装在那里的文件系统。什么df -h发言权?
etagenklo

Answers:


27

回答问题:

  • /tmp应该被自动清空:是的
  • 我们是否应该/tmp定期手动删除文件:您的系统会处理这些文件。

如果您可能会问自己:

  • 我可以/tmp出于任何原因(需要空间,想要删除痕迹等)从其中删除文件吗:取决于请继续阅读

文件系统层次结构标准(FHS)指出

必须使/ tmp目录可用于需要临时文件的程序。

程序不得假定在两次调用之间都保留/ tmp中的任何文件或目录。

/var/tmp/具有类似的用途,但是在重新引导期间一定不能删除它。

不保证/tmp//var/tmp/定期进行清理。尽管大多数系统会不定期进行清理,但这可能取决于您的发行版和设置。见注释通过mike

如果需要删除/ tmp中的文件,请首先查看该文件是否正在使用中。您可以轻松地做到这一点:

lsof /tmp/file_to_delete

如果您有权这样做,将显示持有该文件句柄的进程,例如进程名称,PID和文件类型。要显示所有进程,请sudoroot用户之前添加或运行。

lsof +D /tmp

将显示/tmp+D)下当前打开的目录中的所有文件。当然,您不应该删除这些文件。

实际上,当您删除仍处于打开状态的文件时(如果您有权这样做),该文件将无法从文件系统名称空间访问,但是对于具有打开文件句柄的进程而言,该文件仍然存在。关闭该句柄后,该进程将无法再访问该文件,如果没有进程再打开该文件,则最终将其删除。进程不应假定该文件在后续open调用之间仍然存在,但是程序员草率,而且您永远不会知道。因此,删除某些程序仍在使用的文件并不是很聪明


总的来说,这是所有极好的建议,尤其是最后一段。但是,系统是否确实清理/ tmp取决于该系统。例如,在openSUSE中,不是,除非您将其配置为(从/ etc / sysconfig或通过YaST)。同样,用户的个人〜/ tmp(如果有的话)不会自动清除。
mike 2015年

因此,仍然可以删除进程已打开的文件吗?这不会使程序崩溃吗?那么文件在哪里?程序是否仍可以与此“已打开但已同时删除”的文件进行交互?是否有某种方法使rm难以删除或无法删除文件?像文件锁之类的东西?
CMCDragonkai 2015年

文件是文件系统中的数据集,可通过路径和文件名在分层名称空间中访问。一个文件可以具有多个名称(硬链接),并且进程可以具有文件的打开句柄。如果该文件不可访问,即没有名称且没有打开的句柄,则将其删除。防止删除超出了我的专业知识,而IMO超出了此问题的范围。尝试寻找“ mandatary锁定”。
trapicki 2015年

[是一个重复的答案]
trapicki

4

我认为这取决于操作系统。我以为/ tmp通常在重新启动时清除,实际上,系统在会话中清理自身并不安全,因为它不知道哪些文件处于活动状态。

如果您很勇敢,则可能想将命令删除到crontab中,该命令将删除早于特定年龄的文件,但是如果它删除仍在使用的文件,则可能会引起一些问题。您可以尝试一个命令(我没有尝试过),例如

找到/ tmp -type f -ctime +10 -exec rm {} +

理论上,这会删除10天之前/ tmp下的所有文件。


应该补充-r一下
史蒂文·彭尼

1
绝对不要在其中添加-r,否则将影响或删除文件,如果文件存在于10天之前创建的目录中,则文件的存在时间应少于10天。实际上,该命令可能应该找到/ tmp -type f -ctime +10 -exec rm {} +以将搜索限制为文件。(使用find命令将递归子目录)
davidgo '16

1

/ tmp和/ var / tmp目录按正常时间表进行清理。这可能取决于您的发行版。在我的CentOS系统(RedHat的一个克隆)上,有一个cron作业计划每天运行一次tmpwatch(tmp目录清除程序)。/ var / tmp中的文件比/ tmp /中的文件保留更长的时间。我还看到了在重新启动时修剪/ tmp(但不是/ var / tmp)的脚本,因为所有进程都是新的,因此知道没有什么可以使该文件保持打开状态。

因此,是的,/ tmp具有基本脚本的维护功能。它仍然可以在那些维护时间之外填满。如果您选择手动清理,最好的sysadmin做法是要小心。Sysadmin知识讨论了/ tmp中的符号链接,这些符号链接指向n00b sysadmins运行简单find脚本时已删除的必要系统文件。


2
在具有systemd的Centos 7和其他类似RedHat的版本7+系统上,清理是在/usr/lib/tmpfiles.d/tmp.conf中配置的。这由systemd的目标systemd-tmpfiles-clean.service调用。
shonky linux用户2015年

1

在CentOS上有一个/etc/cron.daily名为的工作tmpwatch,它将以递归的方式删除在给定时间内未访问过的文件。通常,它用于清理用于临时存放空间的目录,例如/ tmp。

这是/etc/cron.daily/tmpwatch脚本

#!/ bin / sh
标志= -umc
/ usr / sbin / tmpwatch“ $ flags” -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X'/ tmp / hsperfdata_ *'10d / tmp
/ usr / sbin / tmpwatch“ $ flags” 30d / var / tmp
对于/ var / {cache / man,catman} / {cat?,X11R6 / cat?,local / cat?}中的d;做
    如果[-d“ $ d”]; 然后
        / usr / sbin / tmpwatch“ $ flags” -f 30d“ $ d”
    科幻
做完了

/tmp 仅在系统重新引导时,目录内容才会被删除,因为正在运行的进程可能已从该目录访问文件。


0

您可以从中删除内容/tmp/;但是这样做的问题在于,如果您有一个定期写入的服务/tmp/并删除了文件,则可能会使服务崩溃或中断,直到重新启动为止。


0

FHS定义/tmp目录“临时文件(另见/ var / tmp中),往往不保留重新启动系统之间”,并/var/tmp为“以重新启动之间不能保留的临时文件”。

如今,/tmp由于在许多GNU / Linux发行版中默认为RAM文件系统(tmpfs)(尽管是可选的),/tmp因此实际上是非持久性的。

(可以说)应用程序应该相应地管理它们的临时文件,我认为,这些文件包括在使用结束后将其删除,而不要求管理员安排可能的破坏性删除。


许多程序在处理完文件/tmp或退出文件时可以做得更好,清理文件,但是在/tmp程序异常终止(崩溃)之后,仍然存在文件遗留的问题。
凯文·费根

0

如果您正在运行Debian(或类似Ubuntu的衍生版本),则应查看/ etc / default / rcS 文件并调整TMPTIME环境变量。根据定义,/ tmp中的内容在下次重新启动时与此处无关。

我建议

  • TMPTIME在服务器上使用变量
  • 将/ tmp作为tmpfs(在ram中)挂载在桌面上(以提高速度)

0

分发当然有所不同,但是我希望临时文件可以由系统自动管理。他们可能会使用cron作业或systemd-tmpfiles-clean服务。如果您担心磁盘空间,这是查看每个根文件夹占用的空间的有用命令:

du -hs /* | sort -h

要查看您的系统是否使用systemd服务来管理临时文件,您可以尝试:

systemctl status systemd-tmpfiles-clean

在底部,您会看到类似以下的内容,它告诉您上次运行服务的时间:

systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-07-18 15:43:36 IST; 18h ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)
  Process: 30495 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
 Main PID: 30495 (code=exited, status=0/SUCCESS)

Jul 18 15:43:36 host-name systemd[1]: Starting Cleanup of Temporary Directories...
Jul 18 15:43:36 host-name systemd[1]: Started Cleanup of Temporary Directories.

请注意,该服务将在清理完成后立即退出。计时器服务负责定期触发它。您可以使用以下方法进行检查:

systemctl status systemd-tmpfiles-clean.timer

并且您应该期望如下所示:

systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
   Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
   Active: active (waiting) since Tue 2018-07-03 10:56:59 IST; 2 weeks 1 days ago
     Docs: man:tmpfiles.d(5)
           man:systemd-tmpfiles(8)

Jul 03 10:56:59 host-name systemd[1]: Started Daily Cleanup of Temporary Directories.
Jul 03 10:56:59 host-name systemd[1]: Starting Daily Cleanup of Temporary Directories.

如果您再次查看负责清理文件的实际服务,您会看到它已执行的所有操作:

/usr/bin/systemd-tmpfiles --clean

因此,您可以直接运行该命令,也可以正确执行以下命令:

systemctl start systemd-tmpfiles-clean

它将为您的系统运行适当的命令。但是,您应该注意,这不是“立即删除所有临时文件”命令。有几个配置文件可控制实际删除的内容以及删除的时间,以便应用程序可以分别配置其临时文件。

寻找临时文件通用处理的地方/usr/lib/tmpfiles.d/tmp.conf可能是以下几行:

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

如果您的系统空间不足,可以将时间更改为更短的时间,例如:

v /tmp 1777 root root 12h
v /var/tmp 1777 root root 1d

为了确定您在做什么,请man tmpfiles.d阅读本手册。再次,我发现这里介绍的方法与CentOS(基于RedHat)和Ubuntu系统有关,但是我对其他发行版了解不多。

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.