flock — скрипт выполнен, но все еще заблокирован

В начале моего bash-скрипта я запускаю flock, чтобы гарантировать, что скрипт не запустится дважды одновременно. Часть скрипта показывает xclock, но как фоновую команду. Итак, я вижу часы, и скрипт завершается (часы все еще отображаются, очевидно). Но когда я хочу перезапустить скрипт, он не позволяет мне это сделать, потому что он все еще заблокирован. Похоже, что блокировка снимается только при закрытии xclock.

Чего я не понимаю, так это почему блокировка остается, когда я запускаю x-приложение в качестве фонового процесса и скрипт завершается. Является ли процесс x-app дочерним по отношению к процессу, выполняющему скрипт? Вот сценарий

#!/bin/bash

fd=200
eval "exec $fd>/tmp/test.lock"
if flock -n $fd; then
  xclock &
else
  echo "locked"
fi

Я был бы очень признателен, если бы кто-нибудь мог объяснить это?

Спасибо, Ральф


person Ralf Butler    schedule 23.10.2015    source источник
comment
Кстати, на какую версию bash вы ориентируетесь? Если он достаточно новый, вы можете использовать некоторые последние расширения синтаксиса, чтобы больше не нуждаться в eval.   -  person Charles Duffy    schedule 24.10.2015
comment
Является ли процесс x-app дочерним по отношению к процессу, выполняющему скрипт? - Конечно, это является. Что еще он мог бы иметь как родитель?   -  person Charles Duffy    schedule 24.10.2015
comment
Эй, Чарльз, предположил, что & делает его независимым от родительского процесса. Но гадит только на задний план. Я использую Баш 4.3.11.   -  person Ralf Butler    schedule 24.10.2015
comment
Правильный; & не определен и не задокументирован, чтобы сделать процесс полностью независимым.   -  person Charles Duffy    schedule 24.10.2015


Ответы (1)


Процесс xclock унаследовал дескриптор открытого файла для файла блокировки, а также блокировку файла. Вы можете закрыть его в этом процессе, перенаправив с помощью &-.

#!/bin/bash

fd=200
eval "exec $fd>/tmp/test.lock"
if flock -n $fd; then
  eval "xclock $fd>&- &"
else
  echo "locked"
fi
person Barmar    schedule 23.10.2015