Я пишу сценарии, которые будут работать параллельно и будут получать свои входные данные из того же файла. Эти сценарии откроют входной файл, прочитают первую строку, сохранят его для дальнейшей обработки и, наконец, сотрут эту строку чтения из входного файла.
Теперь проблема в том, что несколько сценариев, обращающихся к файлу, могут привести к ситуации, когда два сценария одновременно обращаются к входному файлу и читают одну и ту же строку, что приводит к недопустимому результату обработки строки дважды.
Теперь одно из решений - записать файл блокировки (.lock_input
) перед доступом к входному файлу, а затем стереть его при освобождении входного файла, но в моем случае это решение не подходит, поскольку иногда NFS случайным образом замедляет сетевую связь и может не иметь надежной блокировки.
Другим решением является установка блокировки процесса вместо записи файла, что означает, что первый скрипт для доступа к входному файлу запустит процесс с именем lock_input, а другие скрипты ps -elf | grep lock_input
. Если он присутствует в списке процессов, они будут ждать. Это может быть быстрее, чем запись в NFS, но все же не идеальное решение ...
Итак, мой вопрос : существует ли какая-либо команда bash (или другой интерпретатор сценариев) или служба, которую я могу использовать, которая будет вести себя как блокировки семафора или мьютекса, используемые для синхронизации в программировании потоков?
Спасибо.
Небольшой пример:
Допустим, у нас есть input_file следующим образом:
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Сценарий обработки: TrScript.sh
#!/bin/bash
NbLines=$(cat input_file | wc -l)
while [ ! $NbLines = 0 ]
do
FirstLine=$(head -1 input_file)
echo "Hello World today is $FirstLine"
RemainingLines=$(expr $NbLines - 1 )
tail -n $RemainingLines input_file > tmp
mv tmp input_file
NbLines=$(cat input_file | wc -l)
done
Основной скрипт:
#! /bin/bash
./TrScript.sh &
./TrScript.sh &
./TrScript.sh &
wait
Результат должен быть:
Hello World today is Monday
Hello World today is Tuesday
Hello World today is Wednesday
Hello World today is Thursday
Hello World today is Friday
Hello World today is Saturday
Hello World today is Sunday