如何防止清除/ tmp内的文件夹?


12

这个问题是关于我的开发人员笔记本电脑上的Ubuntu 14.10的。

我有一个文件夹/tmp,供应用程序用来在其中放置临时文件。该应用程序通常在我的homedir中创建一个临时文件夹,然后将其删除。出于某种原因,homedir加密后无法正常工作。因此,我改为/tmp/foo在我的homedir中建立了符号链接。我的应用程序可以在此处编写并使其成为临时子文件夹。

现在/tmp/foo,每次我重新启动计算机时都会被删除。到目前为止,我只是在重新启动后手动重新创建了该文件夹。现在,我在如何清理/ tmp目录中学习到了?这样做是有工作的。

我看过了,/etc/init/mounted-tmp.conf但是我的bashfu(尤其是我的findfu)不足以完成我想要的操作。这是该文件的摘录:

   EXCEPT='! -name .
            ! ( -path ./lost+found -uid 0 )
            ! ( -path ./quota.user -uid 0 )
            ! ( -path ./aquota.user -uid 0 )
            ! ( -path ./quota.group -uid 0 )
            ! ( -path ./aquota.group -uid 0 )
            ! ( -path ./.journal -uid 0 )
            ! ( -path ./.clean -uid 0 )
            ! ( -path "./...security*" -uid 0 )'

   # Remove all old files, then all empty directories
   find . -depth -xdev $TEXPR $EXCEPT ! -type d -delete
   find . -depth -xdev $DEXPR $EXCEPT -type d -empty -delete

我想做的是添加一个条件,使其删除内部的所有内容/tmp/foo,但不能删除/tmp/foo其本身。我怎么做?


/tmp/foo目录还是文件?
terdon 2015年

目录。里面有文件。
simbabque 2015年

为什么不在mkdir /tmp/foo前面添加end script呢?
哈根·冯·埃岑2015年

仅供参考(您可能已经知道这一点):14.10将于2015年7月停产,因此您应该尽快升级到Vivid。
Lao Lam 2015年

Answers:


20

/etc/init/mounted-tmp.confmountall软件包的一部分,因此该软件包的所有更新以及建议的更改都将被还原。

$ sudo dpkg -S /etc/init/mounted-tmp.conf 
mountall: /etc/init/mounted-tmp.conf

相反,根据文件系统层次结构标准(FHS)

关于/ tmp

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

关于/ var / tmp

/ var / tmp目录可用于需要临时文件或在系统重新引导之间保留的目录的程序。因此,/ var / tmp中存储的数据比/ tmp中的数据更具持久性。

因此,您应该将符号链接更改为/var/tmp而不是/tmp


3
当您有锤子时,一切看起来都像钉子的经典例子。
WernerCD

@WernerCD您能否解释一下这是什么意思?您是说这/var/tmp不是一个好主意吗?
simbabque

6
当你只有一把锤子... - If a person is familiar with ... a certain, single instrument, they may have a confirmation bias to believe that it is the answer to/involved in everything.我说的是,OP使用/ tmp目录的东西,而不是指用于-使用/ tmp目录作为锤他保持的问题TMP-但并非相当-tmp的东西。/ var / tmp是两次重新启动之间必须保持的状态,因此它是正确的答案。
WernerCD 2015年

8

严格来说,这不是您问题的答案,但您可能会发现/var/tmp它是一个更合适的位置,因为它不会在重新启动后被清除。它是为临时文件设计的,这些文件不应在短时间后自动丢弃。

但是,我经常做的是在/ opt下创建一个文件夹,以存储我不想要的随机物品。这是放置超出主要操作系统控制范围的东西的合适位置。


这是正确的想法。如果/ tmp不能满足您的要求,则将您的信息存储在其他位置-即使有可用空间,也可以将其存储在其他驱动器上。除非Linux是获得所需结果的唯一方法,否则不要与Linux(和其他程序员)期望的某种方法搞混。

6

像这样:

EXCEPT='! -name .
            ...
            ! ( -path "./foo" )'

   # Remove all old files, then all empty directories
   ...
   find /tmp/foo/* -depth -xdev $TEXPR -delete

例:

$ cd /tmp/foo/
$ mkdir 1 2 3
$ touch 3 4 5
$ find /tmp/foo/* -depth -xdev $TEXPR -delete
$ ls /tmp/foo/
$

我确实同意aap用户的意见:如果它们是tmp文件,则应该在使用的软件中进行处理,方法是在该目录中重新创建目录;如果不是tmp文件,则应使用另一个目录进行清除。


这实际上是行不通的。尽管find手动运行该命令时可以正常工作,但是编辑后仍会删除目录/etc/init/mounted-tmp.conf。似乎这里还有其他事情。
terdon

wth。嗯 这意味着第一条线有故障。也许需要相对(?)
Rinzwind 2015年

@terdon是似乎它需要相对到/ tmp /
Rinzwind

我不这么认为,我尝试了各种排列,包括-path ./foo-name '*foo*',但都不起作用(在Ubuntu Server 14.04上)。我认为那不是正确的文件,我们正在寻找错误的位置。您所建议的应该起作用,但似乎不起作用。
terdon

0

将具有未来价值的文件写入/ tmp目录是一个坏主意(如其他人所建议的,/ var / tmp是一个更好的位置)。也就是说,您可能想在chattr上试一试。该操作应在应用程序退出后但关闭之前运行。请记住,此操作此后将不允许任何内容写入该目录。

触摸/tmp/foo/ddmmyy/.001_immute_me chattr + i /tmp/foo/ddmmyy/.001_immute_me


如果我想拥有一个临时目录,那会有什么用?
simbabque

-1

运行这个:

echo "if [ ! -e /etc/foo/ ]; then mkdir /etc/foo/; fi; rm -rf /etc/foo/*" > /bin/foodel; sudo chmod 755 /bin/foodel 

然后将其添加到/ etc / inittab中,请参见此处:inittab文件哪里?

foo:2345:boot:/bin/foodel

如果/ etc / foo不存在,它将在启动时创建它,然后将其清空。

这与bash登录相同:

echo "/bin/foodel" >> ~/.bashrc

Ubuntu版本14不使用/etc/inittab。这在其手册页上明确而明确地指出。
JdeBP 2015年

* facepalm *对不起@JdeBP,这是我在处理4种不同版本的linux之后发生的事情。他可以将代码放在askubuntu.com/questions/34308/where-is-inittab-file
Daniel
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.