заставить скрипты работать исключительно - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь заставить скрипт bash работать исключительно - если другой экземпляр скрипта уже запущен, то дождитесь завершения другого экземпляра, прежде чем запускать новый. Я нашел некоторые ссылки на flock, который звучит так, как будто он должен делать то, что мне нужно, но, похоже, он работает не так, как я ожидаю. У меня есть следующий скрипт:

#!/bin/bash

inst=$1
lock=/nobackup/julvr/locks/_tst.lk
exec 200>$lock
flock -x -w30 200 || { echo "$inst: failed flock" && exit 1; }
echo "$inst:got lock"
for i in {1..2}; do
        echo "$inst: $i"
        sleep  1
done
echo "$inst:done script";

А потом я бегу

> flocktest.sh test1 & flocktest.sh test2
[1] 25213
test1:got lock
test1: 1
test2:got lock
test2: 1
test1: 2
test2: 2
test1:done script
test2:done script
[1]+  Done                    flocktest.sh test1

Кажется, что оба экземпляра flocktest работают параллельно ... Когда flock снимает блокировку? Как заставить его сохранить блокировку до завершения скрипта?

(Кроме того, если я сделаю flock -x -w 20 200, то он будет жаловаться flock: 20: fcntl: Bad file descriptor ..., что кажется странным, поскольку страница руководства предполагает, что я могу добавить параметр --w timeout перед файлом блокировки ...)

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Хорошо, я нашел свою ошибку - я использовал действительно старую версию flock, интерфейс которой отличался от описанного на странице руководства. Я обновился до новой версии стада, и это сработало.

0 голосов
/ 18 января 2019

стадо кажется мне очень сложным.
Возможно, вы можете попробовать этот способ.

cat script_unique.sh 
while test -n "$run_sh"
  do
    sleep 2
  done
  export run_sh="run_sh"
  sleep 2
  echo "$run_sh"
  sleep 4
  echo "$0 $1"
  run_sh=""
...