Существует проблема с принятым решением , если процесс сохраняет открытый файл журнала ; вам в основном нужно повторно использовать i-узел. Mmrobins отвечает хорошо, logrotate должен делать правильные вещи.
Чтобы использовать tail , вы можете что-то сделать (аналогично идее Pantonza & Greg), но сохранить исходный файл, обрезав оригинальный файл на месте:
tail -2000 logfile.txt >logfile.tmp
cat logfile.tmp > logfile.txt
rm logfile.tmp
Чтобы избежать временного файла, вы можете прочитать в переменную, а затем заполнить ее обратно:
bash -c 'X=$(tail -2000 logfile.txt);echo "$X">logfile.txt'
Во всех случаях существует вероятность состязания между усечением и процессом, добавляемым в файл. Не уверен, что logrotate справится с этим, ни одно из решений tail здесь не подходит.