2016-10-31 2 views
1

Я работаю над скриптом 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 секунд друг от друга.

+0

Если вы хотите последовательное выполнение, почему вы бежите их одновременно в первую очередь? – Barmar

+0

Я не уверен, что решение возможно. Предположим, что процесс 3 запускается до процесса 2. Как он узнает, что вы собираетесь запустить процесс 2, поэтому он не должен захватывать блокировку, как только это возможно? – Barmar

+0

Кажется, вам нужен механизм блокировки, в котором блокировка предоставляется в том порядке, в котором они запрошены. – Barmar

ответ

0

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

От https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-queue-system-batch-manager

true >jobqueue; tail -n+0 -f jobqueue | parallel -j1 

Тогда вы можете каждые 5 секунд представить работу, как:

echo my_command my_arg >> jobqueue