Как обрезать файл, который записывается в

У меня есть длительный процесс на удаленном компьютере, который я начал так:

$ nohup ./process > output &

Моя проблема в том, что выходной файл становится все больше и быстрее. И, конечно же, единственное использование этого файла для меня - это мониторинг хода процесса:

$ tail -f ./output

Поэтому я хотел бы время от времени усекать файл, чтобы сэкономить место (боюсь, может не хватить места). Итак, я попробовал это:

$ truncate -s 0 output

Но, похоже, поскольку файл открыт и записывается, эта команда не действует. В качестве теста, как только я удалил файл, но тогда не было создано нового. Поэтому я потерял свой отчет о проделанной работе и мне пришлось перезапустить процесс.

Можно ли как-нибудь обрезать файл во время его записи?

1 ответ

Хотя полноразмерное решение может включать logrotate, это может работать с более простым решением в соответствии со следующим демонстрационным примером.

Я запустил процесс #1, который записывает текущую дату и время в файл output,

while true;do LC_TIME=en_US date>>output;sleep 10;done &

Затем я начал процесс #2, который копирует outputи использует tail для усечения перенаправленной копии обратно в output, Это продолжает писать из процесса № 1 живым. Это может работать и в вашем случае.

while true;do cat output > ttt;tail ttt > output;cat output;echo '----------------------------';sleep 60;done &

Пример вывода из процесса № 2,

Sun Nov 25 14:31:40 CET 2018
----------------------------
Sun Nov 25 14:31:10 CET 2018
Sun Nov 25 14:31:20 CET 2018
Sun Nov 25 14:31:30 CET 2018
Sun Nov 25 14:31:40 CET 2018
Sun Nov 25 14:31:50 CET 2018
Sun Nov 25 14:32:00 CET 2018
Sun Nov 25 14:32:10 CET 2018
Sun Nov 25 14:32:20 CET 2018
Sun Nov 25 14:32:30 CET 2018
Sun Nov 25 14:32:40 CET 2018
----------------------------
Sun Nov 25 14:32:10 CET 2018
Sun Nov 25 14:32:20 CET 2018
Sun Nov 25 14:32:30 CET 2018
Sun Nov 25 14:32:40 CET 2018
Sun Nov 25 14:32:50 CET 2018
Sun Nov 25 14:33:00 CET 2018
Sun Nov 25 14:33:10 CET 2018
Sun Nov 25 14:33:20 CET 2018
Sun Nov 25 14:33:30 CET 2018
Sun Nov 25 14:33:40 CET 2018
----------------------------

Я также проверил, как сделать демонстрационный пример, который не зависает, если окно / соединение закрыто,

nohup bash -c 'while true;do LC_TIME=en_US date>>output;sleep 10;done' &

а также

nohup bash -c 'while true;do cat output > ttt;tail ttt > output;sleep 60;done' &

который можно контролировать с помощью LANG=C tail -f ./output из другого окна / соединения,

Sun Nov 25 15:01:05 CET 2018
Sun Nov 25 15:01:15 CET 2018
Sun Nov 25 15:01:25 CET 2018
Sun Nov 25 15:01:35 CET 2018
Sun Nov 25 15:01:45 CET 2018
Sun Nov 25 15:01:55 CET 2018
Sun Nov 25 15:02:05 CET 2018
tail: ./output: file truncated
Sun Nov 25 15:00:35 CET 2018
Sun Nov 25 15:00:45 CET 2018
Sun Nov 25 15:00:55 CET 2018
Sun Nov 25 15:01:05 CET 2018
Sun Nov 25 15:01:15 CET 2018
Sun Nov 25 15:01:25 CET 2018
Sun Nov 25 15:01:35 CET 2018
Sun Nov 25 15:01:45 CET 2018
Sun Nov 25 15:01:55 CET 2018
Sun Nov 25 15:02:05 CET 2018
Sun Nov 25 15:02:15 CET 2018
Sun Nov 25 15:02:25 CET 2018
Sun Nov 25 15:02:35 CET 2018
Sun Nov 25 15:02:45 CET 2018
Другие вопросы по тегам