每秒钟在tmp目录中创建然后删除的文件

通过错误我注意到在/tmp目录下不断创建一些文件然后立即删除。使用一系列的ls -l /tmp,我成功捕捉到了被创建的文件。
-rw------- 1 root root       0 Apr  2 19:37  YlOmPA069G
-rw------- 1 root root       0 Apr  2 19:37  l74jZzbcs6

或者另一个例子:
-rw------- 1 root root       0 Apr  2 19:44  AwVhWakvQ_
-rw------- 1 root root       0 Apr  2 19:44  RpRGl__cIM
-rw------- 1 root root       0 Apr  2 19:44  S0e72nkpBl
-rw------- 1 root root       0 Apr  2 19:44  emxIQQMSy2

关于的是Ubuntu 18.10和4.18.0-16-generic。这几乎是一个全新安装:我添加了一些服务器软件(nginx、mysql、php7.2-fpm),但即使关闭它们,问题仍然存在。

创建了哪些文件以及为什么创建?如何停止这种行为?这对于SSD来说是非常不可取的。

谢谢!

更新:

问题是当/tmp不在RAM中时(没有tmpfs)。有问题的软件是x2goserver.service,否则是一个必备的软件。


2一个非常不理想的情况是在SSD上运行。请解释一下这个问题?你为什么没有将/tmp设置为tmpfs?为什么内存中的文件会损坏SSD? - Rinzwind
2/tmp不一定是tmpfs,所以这是一个有效的问题。 - Colin Ian King
2是的,在SSD上这是不可取的,至少如果目录元数据实际上被写回磁盘而不仅仅停留在缓存中。这就是为什么"/tmp"通常在tmpfs上(一种使用页面缓存作为后备存储的ramdisk文件系统);您在问题上标记了"[tag:tmpfs]",所以关于SSD的评论似乎有些不恰当。 - Peter Cordes
@OP,这个问题有点离题,但是你对X2Go的体验怎么样? - Marc.2377
1太棒了 - 这是必备的 - Adrian
@ColinIanKing 不是当你将它标记为“tmpfs”时。 - Rinzwind
发布你的 df;这个问题可能很快变成如何正确设置 tmpfs 的问题。 - Joshua
伙计们,tmpfs标签是一个错误,我已经解决了(我将其删除)。考虑到与主题的关系,我并不完全确定tmpfs是否确实是一个错误,但删除它也不会对我造成影响,所以我这样做了。 - Adrian
2@PeterCordes 我不确定说"/tmp通常在tmpfs上"这个说法对于普通的Ubuntu用户是否有效 - 只是使用默认的Ubuntu安装,/tmp是在磁盘上的,OP需要创建适当的fstab条目将其放入tmpfs中。 - Charles Green
@CharlesGreen:哦,那是什么时候改的?我记得Ubuntu至少曾经默认将/tmp放在tmpfs上。(我最近使用的桌面是Arch Linux,我相当确定它默认使用tmpfs。我已经很久没有安装Ubuntu了,所以我可能只是忘记了需要编辑fstab来配置NFS等内容。) - Peter Cordes
@PeterCordes 无法确定——我只从12.04版开始使用Ubuntu——但是如果你从一个live USB引导,并选择“擦除磁盘并安装”,那么/tmp目录就在磁盘上。 - Charles Green
这个文件是由Firefox生成的。关闭Firefox,文件就会消失。 - Gabriel
5个回答

我建议安装并运行fnotifystat以检测创建这些文件的进程:
sudo apt-get install fnotifystat
sudo fnotifystat -i /tmp

你会看到类似以下的进行开启/关闭/读取/写入活动的过程:
Total   Open  Close   Read  Write   PID  Process         Pathname
  3.0    1.0    1.0    0.0    1.0   5748 firefox         /tmp/cubeb-shm-5748-input (deleted)
  2.0    0.0    1.0    0.0    1.0  18135 firefox         /tmp/cubeb-shm-5748-output (deleted)
  1.0    1.0    0.0    0.0    0.0   5748 firefox         /tmp/cubeb-shm-5748-output (deleted)

3附言:我是这个工具的作者:https://kernel.ubuntu.com/~cking/fnotifystat/ - Colin Ian King
1而且你也是第一个回答这个问题的人(虽然现在看不到了)。顺便说一句,这是一个很好的工具。 - Adrian
+1 对于一个非常方便的工具。而且及时性也很好,因为我可以使用它来监控我下一个项目中创建 /tmp/... 文件以实现守护进程和用户空间之间的IPC,而不是使用更复杂的DBUS。 - WinEunuuchs2Unix

确定哪个程序/进程正在操作文件

您可以使用诸如lsof的工具来确定哪些进程和二进制文件正在操作/打开哪些文件。如果文件经常发生变化,这可能会变得麻烦,因此您可以设置一个监视器来通知您:

$ sudo fnotifystat -i /tmp

有时候,仅仅查看用户或组的所有者就能给你一个很好的提示(例如:ls -lsha)。
/tmp目录放入RAM而不是磁盘。
如果你愿意,你可以将你的/tmp目录放入RAM。你需要根据可用的RAM、读写操作的大小和频率来确定这是否是一个明智的选择。
$ sudo vim /etc/fstab

...
# tmpfs in RAM
tmpfs         /tmp         tmpfs         defaults,noatime,mode=1777      0 0
...

$ sudo mount /tmp
$ mount | grep tmp # Check /tmp is in RAM
tmpfs on /tmp type tmpfs (rw,noatime)

如果你有足够的内存,这对于SSD的寿命和系统的速度来说都是非常好的事情。即使你只有较小的内存,通过调整tmpreaper(有时也是tmpwatch)的设置,你也可以实现这一点,并且效果还不错。

非常不理想的一种情况是在SSD上。您在问题中标记了,所以我不太清楚这与SSD有什么关系。Tmpfs是一种内存(或更准确地说,块缓存)文件系统,因此它永远不会访问物理磁盘。
此外,即使您为/tmp文件系统提供了物理后备存储,除非您的系统只有几千字节的RAM,否则这些短暂的文件永远不会写入磁盘,所有操作都将在缓存中进行。
换句话说,由于您正在使用tmpfs,所以没有什么可担心的,即使您不使用tmpfs,仍然没有什么可担心的。

我把/tmp存储在内存中,所以不小心也用我的当前文件系统类型(tmpfs)标记了它。我现在已经删除了它,但我发现你的回答也很有用,所以给你点赞。 - Adrian
@adrhc:如果你的/tmp目录在内存中,那么它与你的固态硬盘没有任何关系,因此它既不可取也不不可取,实际上是完全无关的。 - Jörg W Mittag
我同意,但问题是当没有将/tmp放入RAM中时。碰巧我把/tmp放入了RAM中,但问题仍然让我感到困惑。 - Adrian

人们对SSD的写入耐久性过于担忧。假设每秒创建和删除一个空文件会写入24 kB的数据,以流行的三星860 EVO 250 GB的150 TBW规格为例,耗尽需要193年!
(150 * 10 ^ 12)/((2 * 3 * 4 * 1024)* 60 * 60 * 24 * 365.25)= 193
对于ext4文件系统,使用“tune2fs -l”查找寿命写入量。或者,使用“smartctl -a”并查找Total_LBAs_Written。我总是发现SSD还有很多寿命。

问题是“文件是如何创建的,为什么要创建?我该如何停止这种行为?”你的“答案”如何与问题相关呢? - bummi
虽然没有直接回答问题,但我发现这些信息也很有用,尽管与如何使用这些命令不是非常精确相关。例如,使用tune2fs时,我得到了tune2fs: Bad magic number in super-block while trying to open /dev/nvme0n1 Found a gpt partition table in /dev/nvme0n1的错误提示。 - Adrian

你使用了错误的 /dev/nvme0... 名称:
$ sudo tune2fs -l /dev/nvme0n1
tune2fs 1.42.13 (17-May-2015)
tune2fs: Bad magic number in super-block while trying to open /dev/nvme0n1
Couldn't find valid filesystem superblock.

正确的格式是:
$ sudo tune2fs -l /dev/nvme0n1p6
tune2fs 1.42.13 (17-May-2015)
Filesystem volume name:   New_Ubuntu_16.04
Last mounted on:          /
Filesystem UUID:          b40b3925-70ef-447f-923e-1b05467c00e7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2953920
Block count:              11829504
Reserved block count:     534012
Free blocks:              6883701
Free inodes:              2277641
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1021
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8160
Inode blocks per group:   510
Flex block group size:    16
Filesystem created:       Thu Aug  2 20:14:59 2018
Last mount time:          Thu Apr  4 21:05:29 2019
Last write time:          Thu Feb 14 21:36:27 2019
Mount count:              377
Maximum mount count:      -1
Last checked:             Thu Aug  2 20:14:59 2018
Check interval:           0 (<none>)
Lifetime writes:          4920 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       1308352
Default directory hash:   half_md4
Directory Hash Seed:      a179d56c-6c68-468c-8070-ffa5bb7cd973
Journal backup:           inode blocks

NVMe SSD的寿命而言:
$ sudo nvme smart-log /dev/nvme0
Smart Log for NVME device:nvme0 namespace-id:ffffffff
critical_warning                    : 0
temperature                         : 38 C
available_spare                     : 100%
available_spare_threshold           : 10%
percentage_used                     : 0%
data_units_read                     : 22,351,778
data_units_written                  : 14,667,833
host_read_commands                  : 379,349,109
host_write_commands                 : 127,359,479
controller_busy_time                : 952
power_cycles                        : 1,925
power_on_hours                      : 1,016
unsafe_shutdowns                    : 113
media_errors                        : 0
num_err_log_entries                 : 598
Warning Temperature Time            : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1                : 38 C
Temperature Sensor 2                : 49 C
Temperature Sensor 3                : 0 C
Temperature Sensor 4                : 0 C
Temperature Sensor 5                : 0 C
Temperature Sensor 6                : 0 C
Temperature Sensor 7                : 0 C
Temperature Sensor 8                : 0 C

关键的一句是:
percentage_used                     : 0%

使用18个月后,SSD的使用百分比为0%。如果在使用3年后达到1%,那么我知道这个SSD将持续300年。

显然,这个答案不适合在评论部分回复其他评论。


与SSD寿命相关的是tune2fs输出中的哪个部分? - Adrian
@adrhc,我正在回应你在Fraser Gunn的答案中提到错误信息时,展示了正确调用tune2fs命令的方式。 - WinEunuuchs2Unix