Мне нужно отслеживать файл и отправлять записанное в него веб-сервису. Я пытаюсь найти чистое и простое решение с помощью bash сценариев, например:
#!/bin/bash
# listen for changes on file specified as first argument
tail -F "$1" | while read LINE
do
curl http://service.com/endpoint --data "${LINE}"
done
Это работает отлично, как в ... каждая добавляемая строка будет POST'ed к http://service.com/endpoint. Тем не менее, мне не очень нравится тот факт, что, если за короткое время будет добавлено много строк, у меня будет столько же HTTP-запросов и, возможно, будет перегружен сервис.
Существует ли разумный способ буферизовать операции? Я могу думать о чем-то вроде:
buffer = EMPTY
while LINES are read:
add LINE to buffer
if buffer has more than X LINES
send POST
fi
done
Но в приведенном выше решении, если в час публикуется одна строка, я буду получать обновления каждые X часов, что недопустимо. Другим аналогичным решением было бы «время» в то время как l oop: if X seconds have passed then send buffer, otherwise wait
.., но последняя строка потока может удерживаться неопределенно долго, так как while l oop запускается только тогда, когда новая строка добавляется в файл.
Цель состоит в том, чтобы сделать это с минимальными сценариями bash и без использования второго процесса . Под вторым процессом я подразумеваю: process 1 gets the output from tail -f and stores it
и process 2 periodically checks what is stored and sends a POST if more than x seconds are elapsed
?
Мне любопытно, возможно ли это с помощью какой-нибудь хитрой уловки?
Спасибо!