Как усечь файл, который пишется в

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

$ nohup ./process > output &

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

$ tail -f ./output

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

$ truncate -s 0 output

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

Есть ли какой-либо способ, которым я могу усечь файл, в то время как он пишется в?

1
задан 25 November 2018 в 14:19

1 ответ

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

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

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

Затем я запустил процесс, № 2, который копирует output, и хвост использования для усечения перенаправленной копии назад к 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
1
ответ дан 7 December 2019 в 15:10

Другие вопросы по тегам:

Похожие вопросы: