Как сделать чтобы Perl скрипт работал только в одном экземпляре

Задача

Иногда необходимо написать Perl скрипт, который запускается только если этот же скрипт сейчас не работает. Т.е. гарантировать что в один момент времени работает только один инстанс этого скрипта.

Например, такая задача может возникнуть если скрипт запускается по крону каждую минуту и иногда он может работать больше минуты.

Тут мы говорим о случае когда скрипт работает только на одном сервере и нужно гарантировать выполнение не более чем одного инстанса скрипта на одной машине.

Решение

Самый простой способ решить эту задачу — это использовать Perl библиотеку Sys::RunAlone.

Библиотека не идет вместе с Perl, ее нужно поставить дополнительно.

Для того чтобы сделать скрипт, который работает только в одном экземпляре, нужно добавить в существующий скрипт use Sys::RunAlone; и __END__.

Вот пример скрипта, который работает только в одном экземпляре:

#!/usr/bin/perl

use Sys::RunAlone;

print "working\n";

sleep 10;

__END__

Если запустить этот скрипт, то он выведет на экран текст working и 10 секунд будет висеть и ждать, а потом завершит работу.

Если открыть другую консоль и пока этот скрипт работает попробовать запустить его еще один раз, то этот запуск выдаст ошибку, и никакой код из скрипта выполнен не будет:

$ perl script.pl
A copy of 'script.pl' is already running

Блок __END__ в скрипте является обязательным. Библиотека Sys::RunAlone использует этот блок для того чтобы брать лок. И если этого блока нет, а библиотека Sys::RunAlone подключена, то скрипт работать не будет, на экране появится ошибка Add __END__ to end of script 'script.pl' to be able use the features of Sys::RunALone.

Другие статьи

Комментарии