2015-10-23 4 views
1

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

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

#!/bin/bash 

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

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

Спасибо, Ralf

+0

BTW, какую версию bash вы настраиваете? Если он достаточно новый, вы можете использовать некоторые последние расширения синтаксиса, чтобы больше не нуждаться в 'eval'. –

+0

«Является ли процесс x-app дочерним процессом, выполняющим скрипт?» - Конечно, это является. Что еще было бы в качестве родителя? –

+0

Эй, Чарльз, предположил, что & делает его независимым от своего родительского процесса. Но он держит его только на заднем плане. Я использую bash 4.3.11. –

ответ

3

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

#!/bin/bash 

fd=200 
eval "exec $fd>/tmp/test.lock" 
if flock -n $fd; then 
    eval "xclock $fd>&- &" 
else 
    echo "locked" 
fi 
Смежные вопросы