2013-12-22 1 views
1

У меня есть 5 скриптов perl и вы хотите убедиться, что если кто-то запустит один из скриптов и попробует в то же время запустить другой скрипт, второй скрипт умрет с сообщением о том, что другой скрипт работаетВыполнение только одного скрипта perl может быть запущено одновременно

Я вижу этот механизм на другие сделки StackOverflow с одним экземпляром: What's the best way to make sure only one instance of a Perl program is running?

use Fcntl ':flock'; 
open my $self, '<', $0 or die "Couldn't open self: $!"; 
flock $self, LOCK_EX | LOCK_NB or croak "This script is already running"; 

мой вопрос есть возможность построить какой-то механизм, чтобы убедиться, что только один сценарий запуска на окнах без необходимость блокировки внешнего файла на всех скриптах?

+1

Ваш лучший вариант imho - это открыть внешний файл, который будет использоваться всеми вашими программами. Первый создает файл и до тех пор, пока он есть, остальные либо ждут, либо останавливаются. – simbabque

+0

Я думал об этом варианте. Мне просто интересно, есть ли другой вариант, например, скрыть этот файл, например, используя файлы карт памяти: http: //search.cpan.org/~leont/File-Map-0.61/lib/File/Map. pm или любой другой идеей – smith

+0

Похоже, что он работает только с вилками или потоками. Но вы сказали, что у вас есть пять разных программ, в которых вы хотите убедиться, что только один работает. Я не думаю, что File :: Map может там помочь. Как разные программы (которые могут даже не запускаться одновременно) знают о позиции памяти, которую они должны использовать для проверки? – simbabque

ответ

1

Если у вас есть пять отдельных скриптов, и ни один из них не может быть запущен одновременно, вам нужен какой-то способ доступа к общему источнику данных между ними. Этот общий источник сообщает, работает ли один из них, и что может быть ужасно сложно управлять правильно. Если вам не нравится механизм блокировки, вы можете попробовать базу данных, Redis или что-то подобное, но я не вижу особого значения этого. Если вы считаете, что использование flock неудобно, извлеките его в модуль и просто используйте этот модуль или найдите другой способ управления вашей общей информацией, такой как база данных «SELECT FOR UPDATE» в заявлении режима блокировки.

Мой вопрос: если вы не хотите блокировать внешний файл, в чем причина этого? Если бы мы это знали, мы могли бы лучше ответить на ваш вопрос.

Смежные вопросы