после того, как я увидел, что забыл добавить logrotate-conf для php5-fpm.log на одном сервере, и теперь, видя, что он ДЕЙСТВИТЕЛЬНО вырос, я спрашиваю себя, как разделить этот файл журнала на отдельные, с помощью Суффикс вроде logrotate будет производить. Вы знаете ... как будто этой ошибки никогда не было :-P
Но самое близкое, что я придумал, это:
split -C 10m -d php5-fpm.log php5-fpm.log.
... но при этом создаются такие файлы, как:
php5-fpm.log.00
php5-fpm.log.01
php5-fpm.log.02
...
отсечение начальных нулей от суффикса было бы простой задачей, и ее легко можно было бы сделать вручную. Но вот моя проблема: как я могу изменить суффикс, чтобы файл с самым высоким суффиксом стал файлом с самым низким ??
Чтобы сократить длину суффикса (исключить нули), вы можете сделать следующее:
$ split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.log.
К сожалению, нет параметра, который вы могли бы передать в split, который бы инвертировал суффиксы, но вы можете использовать tac вместо cat, инвертировать файл и передать его команде split, например:
$ tac php5-fpm.log | split --suffix-length=1 -C 10m -d - php5-fpm.log.
Теперь все, что вам нужно сделать, это еще раз инвертировать разделенные файлы (и сжать их, пока мы находимся на этом этапе) :)
$ for i in php5-fpm.log.*; do tac $i | gzip > $i.gz; rm -f $i; done
РЕДАКТИРОВАТЬ:
Есть другой подход, который можно использовать для этого, если вы не хотите использовать tac:
split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.
export COUNT=$(expr $(ls php5-fpm.[0-9] | wc -l) - 1)
for i in $(seq 0 $COUNT); do
mv php5-fpm.$i php5-fpm.log.$(expr $COUNT - $i);
done
Первая команда разделит большой файл журнала на более мелкие: php5-fpm.0 php5-fpm.1 php5-fpm.2 ... позже вы подсчитываете количество файлов и только инвертируете числа с помощью оценки выражения bash: expr (1).
Вы можете добиться переименования с помощью этого быстрого и грязного сценария оболочки:
#!/bin/bash
for x in php5-fpm.log.*
do
max=${x/php5-fpm.log./}
done
mkdir renamed-files || exit 1
for x in php5-fpm.log.*
do
num=${x/php5-fpm.log./}
let num=max-num+1
mv $x renamed-files/php5-fpm.log.$num
done
mv renamed-files/* .
rmdir renamed-files
Обратите внимание, что переименованные файлы собираются в подкаталоге, чтобы избежать конфликтов имен с еще не переименованными файлами.
Обратите внимание также на выход после mkdir в случае подкаталога renamed-files
не может быть создан, например, потому что файл с таким именем существует. В этом случае продолжение сценария может иметь необратимые нежелательные последствия.