The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Реализация локов в Perl скриптах."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Скрипты, настройки и файлы конфигурации. (Public)
Изначальное сообщение [Проследить за развитием треда]

"Реализация локов в Perl скриптах." 
Сообщение от gara emailИскать по авторуВ закладки on 27-Июн-03, 13:40  (MSK)
Perl_скрип выполнялся в единственной копии.

На форуме обсуждалась эта тема но мне кажется что многим пригодится.

Очень часто необходимо чтоб Perl_скрип выполнялся в единственной копии
в один момент времени, т.е. чтоб в одно и тоже время небыло запущенно 2
одинаковых скрипта.

Ниже перведена функция которая это обеспечивает.

#!/usr/bin/perl
use Fcntl qw(:DEFAULT :flock);
test_unique();

...
# Код программы
...


exit;

sub test_unique(){
my @a=split /\//,$0;
my $lockfile="/var/run/".$a[$#a]."\.lock";
    if (-e $lockfile){
        if (sysopen(FH, $lockfile, O_WRONLY) && flock(FH, LOCK_EX|LOCK_NB)){
        return 0;
        } else { print "Script $a[$#a] alredy started!!!\n"; exit(); }
    }
    sysopen(FH, $lockfile, O_WRONLY|O_CREAT) && flock(FH, LOCK_EX|LOCK_NB) ||
die $!;
    return 0;
}

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Реализация локов в Perl скриптах." 
Сообщение от Димыч Искать по авторуВ закладки on 03-Июл-03, 00:06  (MSK)
Это конечно здорово, но я обычно использую попроще:
в начале скрипта:

exit if -e /tmp/running
system('touch /tmp/running');
...
в конце скрипта:
system('rm -f /tmp/running');


При небольшом количестве запускаемых скриптов одновременно (например по таймеру, каждые пять минут, зато после запуска может уйти в глубокий и тяжёлый просчёт) очень даже работает.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Реализация локов в Perl скриптах." 
Сообщение от gara emailИскать по авторуВ закладки on 11-Июл-03, 01:08  (MSK)
>Это конечно здорово, но я обычно использую попроще:
>в начале скрипта:
>
>exit if -e /tmp/running
>system('touch /tmp/running');
>...
>в конце скрипта:
>system('rm -f /tmp/running');
тоже так делали раньше.
НЕКАТИТ, если скрипт вываливается посередине (малоли) то второй раз он не запускается. а с описанным выше способом при выпадении скрипта снимается лок и второй раз скрипт запускается без проблем.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Реализация локов в Perl скриптах." 
Сообщение от dm emailИскать по авторуВ закладки(??) on 13-Сен-04, 20:57  (MSK)
>>exit if -e /tmp/running
>>system('touch /tmp/running');
>>в конце скрипта:
>>system('rm -f /tmp/running');
unlink($lockfile)
пусть сам перл удаляет :)

>тоже так делали раньше.
>НЕКАТИТ, если скрипт вываливается посередине (малоли) то второй раз он не запускается.
Вываливается скрипт же не просто так, бывают ситуации что и не стоит ему запускаться, дабы воизбежания :)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Реализация локов в Perl скриптах." 
Сообщение от rWizard emailИскать по авторуВ закладки(ok) on 02-Окт-04, 01:50  (MSK)
>>>exit if -e /tmp/running
>>>system('touch /tmp/running');
>>>в конце скрипта:
>>>system('rm -f /tmp/running');
>unlink($lockfile)
>пусть сам перл удаляет :)
>
тогду пусть и сам создает.
open(LOCK,">/tmp/running"); close LOCK;
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру