我已阅读了数十篇有关该主题的帖子,但仍找不到适合我的解决方案。
我有一个用户帐户。该帐户的 PHP 会话存储在
/home/user/tmp
Apache 开始抛出错误,由于设备已满,我无法打开会话。
df 和 df -i 都显示设备有足够的空间。
于是我查看了 /home/user/tmp 目录。它显示目录的大小为 901MB。
我想从目录中删除会话文件。
我努力了
rm -rf /home/user/tmp/sess_*
我让它运行了一个多小时,然后用来cntr+C
终止命令。目录仍然显示 901 MB。
我已经重新启动系统,但目录仍然显示为 901MB。
我努力了
find /home/*/tmp -type f -name 'sess_*' -ctime +5 -delete
就像rm -rf
我让命令运行一个多小时然后将其终止一样。
该目录仍然显示901MB。
我以 root 用户身份发出这些命令。我使用的是 ubuntu 16.04。这是一个服务器,因此只有命令行选项有效。
我该怎么做才能删除这些会话文件?
答案1
通常,即使使用类似命令,你也无法删除会话文件,sudo rm -rf /var/lib/php/sessions/*
因为路径名扩展发生在 sudo 之前(https://serverfault.com/a/851261/591003)。
您可以尝试另一个命令,sudo sh -c "rm -rf /var/lib/php/sessions/*"
但如果您有大量文件,您会得到一个答案,rm: Argument list too long
因为会话文件列表通常非常庞大(多达数百万个文件)。
我建议一个非常简单的方法:
- 新建一个文件夹会话_新:
mkdir /var/lib/php/sessions_new
- 设置与旧版本相同的权限会议目录:
sudo chmod --reference=sessions sessions_new
- 对所有权也采取同样的做法:
sudo chown --reference=sessions sessions_new
- 杀了它!
sudo rm -rf /var/lib/php/sessions
- 你不需要等待很长时间才能得到结果。你可以立即在新的终端窗口中通过 来查看结果
sudo find /var/lib/php/sessions/. -type f|wc -l
。此命令会统计你的会议文件夹。运行两次。如果第二次运行该命令时得到的数字低于第一次,则表示进程正在朝着正确的方向进行。 - 等了好久了:P
- 当过程完成后只需重命名会话新目录:
mv /var/lib/php/sessions_new /var/lib/php/sessions
答案2
如果有很多小文件,删除可能需要相当长的时间。让它运行直到完成。它最终应该会完成。
我在我的系统上做了一个快速测试,删除使用 ext4 的 SSD 磁盘上的 10 万个空文件需要 1.14 秒。如果你有数千万个文件,可能需要一段时间。
答案3
我认为Dzmitry Kulahin 的 解决方案可以,但就我而言,空间不足,因此无法创建新的“sessions_new”目录。我使用命令行 php 在交互模式下解决了这个问题:
sudo php -a
请注意必须使用sudo
,否则后续命令没有操作权限。
将此序列写在一行上,有必要将其写在一行上,因为在交互模式下,每次按下回车键都会立即执行该命令:
$listfile = scandir("/var/lib/php/sessions/");
foreach ($listfile as $file) {
if (!is_dir("/var/lib/php/sessions/".$file)) {
unlink("/var/lib/php/sessions/".$file);
}
}
按下该enter键,文件开始删除。
您可以通过打开另一个终端并输入以下内容来监控取消情况:
sudo find /var/lib/php/sessions/. -type f|wc -l
它将显示目录中的文件数量,重复此命令几次,您将看到随着文件被删除,文件数量会减少。