Я работаю над скриптом bash, где одновременно могут работать несколько экземпляров. Я пытаюсь предотвратить это. Поэтому я использую механизм flock, чтобы убедиться, что работает только один экземпляр скрипта. Остальные экземпляры ждут своей очереди.Обработка параллельных заданий последовательным образом
exec 200<$LOCK
flock -x 200
echo "secured flock $1"
sleep 10
echo "exit $1"
Однако при таком подходе нет гарантии на порядок исполнения. Например:
# ~/proj/scripts $ sudo ./parallel.sh 2 &
[2] 10668
# ~/proj/scripts $ sudo ./parallel.sh 3 &
[3] 10674
# ~/proj/scripts $ sudo ./parallel.sh 4 &
[4] 10681
# ~/proj/scripts $ sudo ./parallel.sh 5 &
[5] 10687
# ~/proj/scripts $ sudo ./parallel.sh 6 &
[6] 10696
secured flock 3 exit 3
secured flock 6 exit 6
secured flock 4 exit 4
secured flock 2 exit 2
secured flock 5 exit 5
Я пытаюсь увидеть, если его можно выполнить ту же защиту concurency с обеспечением порядка вызова
Приведенный выше пример является лишь упрощением.
Эти процессы обычно запускаются периодически каждые 5 секунд. Но иногда может потребоваться более 5 секунд (например, 10 секунд), чтобы закончить исполнение. Поэтому я могу определенно сказать, что процесс 2 начнется до процесса 3. Но если процесс 2 занимает много времени, то нет гарантии, что процесс 4-6 начнется в том же порядке, даже если они начинаются примерно на 5 секунд друг от друга.
Если вы хотите последовательное выполнение, почему вы бежите их одновременно в первую очередь? – Barmar
Я не уверен, что решение возможно. Предположим, что процесс 3 запускается до процесса 2. Как он узнает, что вы собираетесь запустить процесс 2, поэтому он не должен захватывать блокировку, как только это возможно? – Barmar
Кажется, вам нужен механизм блокировки, в котором блокировка предоставляется в том порядке, в котором они запрошены. – Barmar