Атомное чтение и усечение файла в Linux - PullRequest
1 голос
/ 08 июня 2019

Я создаю планировщик процессов, и все процессы запускаются как ./program > out.txt.

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

  • Я не могу изменить команду расписания или программу.Однако сборщик данных знает PID процесса производителя данных, и сборщику данных разрешено контролировать / приостанавливать процесс.

  • Под всеми «читать все данные» я подразумеваю все сброшенные данные.Если я смогу принудительно очистить канал, это будет полезно, и, пожалуйста, напишите, но основной вопрос заключается в том, как сделать так, чтобы данные о сбрасывании / буферизации канала никогда не сбрасывались между операцией чтения и усечения.

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Вы можете приостановить и продолжить процесс с помощью

kill -STOP $pid
kill -CONTINUE $pid

Однако я не думаю, что kill -STOP $pid является синхронным, поэтому следует выполнить цикл и подождать, пока процесс не изменит состояние (доступно в /proc или через ps).

Кроме того, из-за повторного использования ПИД-кода вышеописанные операции будут по сути быстрыми (вы можете запустить непреднамеренный процесс), если вы не сделаете их из родительского элемента $pid в такой ситуации.таким образом, что pid не будет получен, пока вы не закончите с вызовами kill (интерактивные оболочки автоматически получают pid в обработчике SIGCHLD).

0 голосов
/ 08 июня 2019

Вы можете попробовать flock.

Со страницы руководства:

(
flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...