<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Раздел полезных советов: Как создать лок файл на Perl</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html</link>
    <description>Для защиты от одновременного запуска нескольких процессов, можно сделать так:&lt;br&gt;&lt;br&gt;my $cfg_glob_lock=&quot;/var/run/test.pid&quot;;&lt;br&gt;&lt;br&gt;# Проверяем лок.&lt;br&gt;if (-f $cfg_glob_lock)&#123;&lt;br&gt;      # Лок присутствует. Проверяем не дохлый ли процесс.&lt;br&gt;      my $lock_pid = 0;&lt;br&gt;      open(LOCK,&quot;&amp;lt;$cfg_glob_lock&quot;);&lt;br&gt;      # Если удалось заблокировать, значит процесс мертв.&lt;br&gt;      my $zombie_lock_flag = flock(LOCK, 2&amp;#124;4);&lt;br&gt;      $lock_pid = &amp;lt;LOCK&amp;gt;;&lt;br&gt;      close (LOCK);&lt;br&gt;      chomp ($lock_pid);&lt;br&gt;      if ($lock_pid &amp;gt; 0 &amp;&amp; $zombie_lock_flag == 0)&#123;&lt;br&gt;          # Реакция на зависший процесс.                                        &lt;br&gt;          die &quot;Proccess locked (pid=$lock_pid)&quot;;&lt;br&gt;      &#125; else &#123;&lt;br&gt;          # Лок от мертвого процесса.&lt;br&gt;          unlink(&quot;$cfg_glob_lock&quot;);&lt;br&gt;          warn(&quot;DeadLock detected ($lock_pid)&quot;);&lt;br&gt;      &#125;&lt;br&gt;&#125;    &lt;br&gt;# Записываем pid в новый лок файл.&lt;br&gt;open(LOCK,&quot;&amp;gt;$cfg_glob_lock&quot;);&lt;br&gt;print LOCK &quot;$$&#092;n&quot;;&lt;br&gt;close(LOCK);&lt;br&gt;# Открываем лок.&lt;br&gt;open(GLOB_LOCK,&quot;&amp;lt;$cfg_glob_lock&quot;);&lt;br&gt;flock(GLOB_LOCK, 2);&lt;br&gt;&lt;br&gt;.... рабочий код скрипта&lt;br&gt;&lt;br&gt;#</description>

<item>
    <title>Как создать лок файл на Perl (Критик)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#6</link>
    <pubDate>Thu, 24 Feb 2005 10:50:39 GMT</pubDate>
    <description>Пародон, а чем use Proc::Lock::File; уже устарел???</description>
</item>

<item>
    <title>Как создать лок файл на Perl (Сергей)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#5</link>
    <pubDate>Fri, 21 Jan 2005 12:12:58 GMT</pubDate>
    <description>Да, open точно работает, по крайней мере на C я проверял. Perl тоже должен, обвязка же в итоге сводится к вызову open(2) AFAIK.&lt;br&gt;Не работает для платформ DOS-OS2-Win, там только через rename, потому что очень сильно зависит от реализации библиотеки, да и в случае хорошей библиотеки нельзя закладываться на это ;-(&lt;br&gt;Мака под рукой нету, VMS тоже, на них не проверял ;-)</description>
</item>

<item>
    <title>Как создать лок файл на Perl (Maxim Chirkov)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#4</link>
    <pubDate>Fri, 21 Jan 2005 07:01:45 GMT</pubDate>
    <description>&amp;gt;лучше всё-таки использовать символьные константы O_CREAT и прочие, они от юникса к &lt;br&gt;&amp;gt;юниксу отличаются, а мы же боремся за переносимость ;) &lt;br&gt;&lt;br&gt;Поправил.&lt;br&gt;&lt;br&gt;&amp;gt;И по поводу хардлинков не всё так просто: на монтированных файловых системах, &lt;br&gt;&amp;gt;типа той же самбы, их не будет, что приведёт к очевидным &lt;br&gt;&amp;gt;проблемам. &lt;br&gt;&amp;gt;Впрочем, вариант с open тоже имеет трудности на некоторых реализациях NFS, но &lt;br&gt;&amp;gt;этим, пожалуй, уж точно можно пренебречь. &lt;br&gt;&lt;br&gt;А для samba разделов  open лок точно без проблем работает  ? Просто на них тот же File::Find без рукоприкладства ($File::Find::dont_use_nlink=1) неработоспособен.&lt;br&gt;&lt;br&gt;Впринципе, для локов хардлинками на CPAM есть готовый модуль File::NFSLock.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Как создать лок файл на Perl (Сергей)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#3</link>
    <pubDate>Fri, 21 Jan 2005 06:06:10 GMT</pubDate>
    <description>Ещё (я не зануда ;-):&lt;br&gt;&lt;br&gt;лучше всё-таки использовать символьные константы O_CREAT и прочие, они от юникса к юниксу отличаются, а мы же боремся за переносимость ;)&lt;br&gt;&lt;br&gt;И по поводу хардлинков не всё так просто: на монтированных файловых системах, типа той же самбы, их не будет, что приведёт к очевидным проблемам.&lt;br&gt;Впрочем, вариант с open тоже имеет трудности на некоторых реализациях NFS, но этим, пожалуй, уж точно можно пренебречь.</description>
</item>

<item>
    <title>Как создать лок файл на Perl (Maxim Chirkov)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#2</link>
    <pubDate>Thu, 20 Jan 2005 20:22:43 GMT</pubDate>
    <description>&amp;gt;А если чужой файл появился в промежутке между &lt;br&gt;&amp;gt;if (-f $cfg_glob_lock)&#123; &lt;br&gt;&amp;gt;open(LOCK,&quot;&amp;gt;$cfg_glob_lock&quot;); ?&lt;br&gt;&lt;br&gt;Полностью согласен, поправил в контексте использования sysopen(LOCK,$cfg_glob_lock, O_CREAT&amp;#124;O_EXCL&amp;#124;O_WRONLY), можно также вариант блокировки хардлинками привести.&lt;br&gt;&lt;br&gt;Для борьбы с использованием Race Condition в плане безопасности еще хорошо помогает монтирование world writable разделов с nosymfollow и создание локов/временных файлов в недоступных для посторонних местах.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Как создать лок файл на Perl (Сергей)</title>
    <link>https://m.opennet.me/openforum/vsluhforumID3/4985.html#1</link>
    <pubDate>Thu, 20 Jan 2005 14:08:38 GMT</pubDate>
    <description>А если чужой файл появился в промежутке между &lt;br&gt;if (-f $cfg_glob_lock)&#123;&lt;br&gt;и&lt;br&gt;open(LOCK,&quot;&amp;gt;$cfg_glob_lock&quot;); ?&lt;br&gt;&lt;br&gt;man 2 open&lt;br&gt;/EX&lt;br&gt;&lt;br&gt;Все другие варианты, к сожалению, нерабочие ;(</description>
</item>

</channel>
</rss>
