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

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

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

我有一个文件夹,/tmp应用程序用它来存放临时文件。此应用程序通常会在我的主目录中创建一个临时文件夹,然后将其删除。由于某种原因,当主目录加密时,这种方法不起作用。因此,我创建了一个指向/tmp/foo主目录内部的符号链接。我的应用程序可以在那里写入并创建它的临时子文件夹。

/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其本身。我该怎么做?

答案1

/etc/init/mounted-tmp.conf是软件包的一部分mountall,因此该软件包上的任何更新和建议的更改都将被恢复。

$ 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

答案2

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

不过,我经常做的是在 /opt 下创建一个文件夹,用于存储我不想放在家里的随机物品。这是一个适合放置主操作系统无法控制的东西的地方。

答案3

就像这样:

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 文件)。

答案4

运行这个:

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

相关内容