rm -f *: Argument list too long

На одном серваке который достался мне с новым заказчиком от неизвестного коллеги админа постоянно была какая то ерунда, периодами падал сервер с симптомами — диски на 100% и процессор на 100%, при этом процессор довольно неплохой «Xeon(R) CPU E5-1650 v2 @ 3.50GHz»

Долго ковырялся в этом сервере, грешил на все что можно, но ничего не подтверждалось, пока не обнаружил что директории с сессиями «заботливо» не чистились, никогда, вообще никогда с момента запуска сервака и доменов на нем. Мне не удалось на некоторых доменах даже посчитать чисто для интереса сколько там было файлов линейно в директории, хотя в одной я все же для интереса обнаружил 28 миллионов файлов, считало долго.

Встал остро вопрос как чистить такие каталоги, так как стандартными средствами линукса это не реально (ошибка «rm -f *: Argument list too long«). Наткнулся на доброго человека на хабре который поделился кодом низкоуровнего удаления файлов, хоть и долго, зато спокойно и без лишнего гемора.

Ниже идет код на С который нужно собрать на сервере и запустить, указав в качестве параметра каталог откуда удалять. В комментарии к коду идет пометка что нужно указать номер inode для текущего каталога и на уровень выше, это делается просто командой «ls -li», в остальном достаточно тупого копипаста, файл я обозвал «lssss.c»:

Код любезно стянул с хабра себе на заметку.

Далее на сервере компилируем код:

Получившийся файл я прописал в cron для запуска раз в минуту:

Посмотрим через время как оно будет, но надеюсь что по чуть чуть вычистит и я смогу включить  автоматическую чистку сессия в php.

В принципе можно так не извращаться, если директорию удалось открыть или в ней всего пару сотен тысяч файлов или 1-2 миллиона, в ней можно пустить команду:

повторюсь — пускать только находясь в директории, если же не получается запускать в директории, можно попробовать пустить ее их другого места, только в параметрах указать пусть к каталогу:

для снижения нагрузкаи на диски можно добавть nice и ionice

 

2 голоса

One thought on “rm -f *: Argument list too long

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*
Website