Я пытаюсь заставить скрипт 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
перед файлом блокировки ...)