2015-10-02 4 views
1

Я использую PipelineDB для аналитики. Для хранилища данных я хочу добавить все новые данные в файл и tail -F в psql, как в примерах на веб-сайте.Как избежать условий гонки при добавлении файла?

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

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

Edit:

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

ответ

0

Вы можете моделировать мьютекс с помощью MKDIR, который атомное создать-и-проверка на работоспособность (это обеспечивается на уровне ядра):

# locking example -- CORRECT 
# Bourne 
lockdir=/tmp/myscript.lock 
if mkdir "$lockdir" 
then # directory did not exist, but was created successfully 
    echo >&2 "successfully acquired lock: $lockdir" 
    # continue script 
else 
    echo >&2 "cannot acquire lock, giving up on $lockdir" 
    exit 0 
fi 

Для получения дополнительной информации (и других решений), посмотрите на фака:

http://mywiki.wooledge.org/BashFAQ/045

+0

Предпочтительно, я хочу, чтобы мои скрипты для запуска одновременно. – geon

+0

Тогда другой вариант - использовать именованные каналы для синхронизации. – redobot

+0

Просьба уточнить? – geon

1

Вы можете предварять/обернуть все операции записи с помощью мьютекса с помощью GNU Parallel так:

sem --id atomicwrite echo hi >> file 

Таким образом, чтобы проверить его, запустить каждый из них в отдельных терминалах:

for i in {0..999}; do sem --id atomicwrite echo hi >> file ; done 
Смежные вопросы