Використання pid-файлів для запобігання повторного запуску скрипта, perl, assembler, сі - блог

Використання модулів File :: Pid, ​​Pid :: File :: Flock і File :: Flock :: Tiny. Блокування файлів, робота з pid-файлами. Робота тільки однієї копії скрипта в один момент часу. Захист від повторного запуску одного і того ж скрипта, до того, як перший примірник завершить свою роботу.

Припустимо, що є perl-скрипт, який забирає дані з віддалених серверів. Або розносить дані з одного джерела в таблиці БД. Скрипт працює досить довго, від півгодини і більше - залежить від обсягу даних, швидкості відповіді віддалених серверів і т.п. Запускається по cron, раз на годину.

Щоб уникнути проблем з дублюванням даних, взаємними блокуваннями в БД і т.п. необхідно щоб скрипт завжди був запущений тільки в одному екземплярі.

Для цього можна використовувати pid-файл. При запуску, скрипт перевіряє наявність pid-файлу. Якщо файл доступний, то блокує його і зберігає у файлі свій PID, і тільки після цього приступає до виконання своєї основної роботи. Якщо файл існує, але доступ до нього заблоковано - скрипт відразу ж завершує свою роботу. Якщо pid-файл не існує, то скрипт створює його, блокує, зберігає свій pid, і приступає до основної роботи.

Для того, щоб не винаходити велосипед, можна знайти на cpan модулі для роботи з pid-файлами. У простих додатках їх буде цілком достатньо.

File :: Flock :: Tiny

File :: Flock :: Tiny - дуже зручний модуль для роботи з pid-файлами.

Установка проходить без проблем.

Робить спробу заблокувати зазначений файл і зберегти в нього ID поточного процесу. Якщо спроба вдалася - повертає посилання на заблокований об'єкт, якщо немає - поверне undef. Після завершення процесу файл не видаляється, але блокування буде знято. При повторному виконанні файл буде знову заблоковано, ID процесу в файлі - оновлений.

Видаляє всі дані з заблокованого файлу, якщо вони були, і зберігає в нього ID поточного процесу.

Знімає блокування і закриває файл.

Метод закриває дескриптор, але блокування з файлу не знімає! Може бути використано, якщо є породжені дочірні процеси, яким блокування ще для чогось буде потрібна.

Однак, даний метод працює не на всіх операційних системах, тому, в ім'я переносимості програм - його краще не використовувати.

Pid :: File :: Flock

Приклад використання, pid4.pl:

До перевірки, чи дійсно можна запобігти повторний запуск скрипта за допомогою
File :: Pid не дійшло. Не бачу сенсу. Можливо, даний модуль став неактуальним з плином часу, написаний з помилками (що більш ймовірно), і має проблеми з використанням на різних операційних системах.

Згадала, що File :: Pid використовувався в одній з систем, яку я зустрічала року 3 назад. Запуск скриптів там завжди був проблемою. Або не запускалися взагалі, або запускалися в декількох примірниках. Тепер зрозуміло - чому. Не рекомендую.

Корисні посилання

Навігація по публікаціям

Якщо процес падає десь в середині, блокування знімається?

У мене скрізь є підключення до memcached або redis, я там ставлю ознака блокування з expire. Якщо процес впав і не видалив за собою lock, тоді він помре сам по собі через якийсь час.

Залежить від того, який модуль використовується для перевірки. Ті, які я приводила в приклад, перевіряють наявність блокування і самого процесу на початку роботи. Якщо процесу вже немає - то «блокування» не дійсна. Справді, там не використовується блокування на рівні операційної системи, коли я зайшла і підредагувати pid-файл під час роботи процесу, за допомогою mc - мені система і слова не сказала :) Так що, якщо передбачається чийсь зловмисний доступ до pid -Файл, треба перед впровадженням такої системи, гарненько її перевірити.

Пошук по блогу програміста