Всем привет, на сервере стоит апач и куча папок с root правами ~ 1 200 000 папок и в каждой по 1 файлу. Все находится на Amazon aws, linux ubuntu. Поскольку сам диск 22Гб, то количество хранимых файлов на единицу памяти было увеличено. Файловоя система ext4, inode_ratio = 4096 , что дает возможность на 22ГБ хранить ~ 6 000 000 инодов.
Задача: нужно всем 2 400 000 файлам дать chown www-data.www-data и chmod 0755
Я делаю: sudo chown www-data.www-data -R dir/
в итоге проходит минут 15 и удается установить владельца только для 600 000 файлов, а дальше не идет
Копал в инете, нашел некий
xargs -p и find. Не могу их скомпоновать, подскажите кто знает как установить
chown только для тех файлов кто сейчас под root и так же chmod 0755 для тех файлов, которые не имеют его
Что-то вроде этого (
не используйте этот пример, он не верный)
find -юзер root dir/ | xargs -p chown www-data.www-data -R dir/
find -права -rw-r--r-- dir/ | xargs -p chmod 0755 -R dir/ UPDATE:
важная деталь - все папки пронумерованы от 1 до 1 200 000 и имеют следующую структуру 1/file.txt
ОТВЕТ
Спасибо за помощь
Aves и
fomistoklus!!!
Для этой задачи не смог найти решение из уже реализованных средств. Возможно они и работают, но я не смог убедиться в этом. Был написан скрипт для решения задачи:
#!/bin/bash
echo "run it"
filename=/var/www/html/counter.txt
current=0
max=0
lim=0
cnt=1
totalcount=1
while read -r string
do
for word in $string; do
if [ "$cnt" -eq "1" ]
then current=$word
elif [ "$cnt" -eq "2" ]
then max=$word
else
lim=$word
fi
cnt=$((cnt+1))
done
done < "$filename"
echo "$current"
echo "$max"
echo "$lim"
while [ "$current" -le "$max" ]
do
if [ -d /var/www/html/questions/"$current"/ ]; then
cd /var/www/html/questions/"$current"/
find . ! -perm 0755 -exec chmod 0755 {} \;
find . ! -user www-data -exec chown www-data.www-data {} \;
totalcount=$((totalcount+1))
fi
echo "loop"
current=$((current+1))
if [ "$totalcount" -gt "$lim" ]
then break
fi
done
echo "$current $max $lim"
echo "$current $max $lim" > /var/www/html/counter.txt
cd /var/www/html/
где counter.txt - файл с текущей папкой, максимальным количеством файлов и лимитом в таком виде
1 1150022 60
Нужно не забыть установить скрипту chown +x script.sh
Далее ставим cron на каждую минуту:
*/1 * * * * /var/www/html/script.sh >/dev/null 2>/dev/null
И вуаля:
364 1151860 60
- через 5 минут
Скорость и лимит зависит от вашего сервера, диска, в моем случае 1ГБ ОЗУ и 6 000 000 иннодов почти, что значительно уменьшает скорость.
Примерно через 2000 минут (~14 дней) будут установлены привилегии и владельцы для всех ~2 400 000 файлов
Как ускорить?
запускать скрипт с разными counters.txt:
1 180000 60
180000 360000 60
360000 540000 60
540000 720000 60
720000 100000 60
100000 120000 60
в 6 раз быстрее, что в теории дает нам результат примерно за 2 дня