Столкнулся недавно с такой проблемой — не смог файловым менеджером даже просто открыть папку с временными файлами на своём веб-сервере под UNIX. Размер, папки, т.е. сам список файлов оказался объемом в 85 мегабайт. Сколько там файлов, я даже не представляю.
Поняв, что файловым менеджером туда даже не стоит и соваться, я перешел в командную строку, зашел в /tmp и попробовал запросить список файлов:
1 2 |
cd /tmp ls |
UNIX призадумался секунд на 20, но все же выдавил из себя этот мега-список. Так я по крайней мере убедился, что проблема именно в количестве файлов, в не в чем либо ещё. Каталог оказался забит файлами сессий веб-сервера, которые не чистились несколько лет. Так как все они начинались с префикса «sess_», я попытался их удалить, пользуясь маской:
1 |
rm -r sess_* |
На что UNIX сообщил:
1 |
Argument list too long |
Так сразу весь список не удалить. На помощь пришла команда find c ключем —exec.
1 |
find /tmp -name "sess_*" -exec rm {} \; |
Т.е. мы поискали в папке /tmp файлы сессий и для каждого из них выполнили команду удаления.
Подобная проблема возникла впервые, и я, честно говоря, был озадачен, что обычные трюки не работают. Командами типа find да еще и с ключем -exec каждый день мне не приходится пользоваться. Все когда то происходит в первый раз.
Пока ждал удаления, наваял скрипт на PHP, как «PLAN B».
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $d = dir("/tmp"); $curtime = time(); while (false !== ($entry = $d->read())) { if (strpos($entry, 'sess_') === 0 && $curtime - filemtime("/tmp/$entry") > 86400 ) { unlink("/tmp/$entry"); } else { echo "passed .. " . $entry . '<br />'; } } $d->close(); ?> |
Он перебирает файлы в /tmp и удаляет начинающиеся на «sess_», но с учетом времени последней модификации файла. Т.е. это сборщик мусора, удаляющий файлы сессий.
Надо будет разобраться со сборкой мусора на веб-сервере, т.к. наверняка можно обойтись без экзотики команд UNIX и скриптов на PHP для сборки мусора.