Ручні циркові демони, Python, Програмування, статті

Андрій Воробець

Вам ніколи не хотілося мати
ручного демона? Це жарт, звичайно, але написати свого демона для
unix-like ОС і навчити його виконувати ті трюки, які вам
потрібні – по-моєму, це дуже корисне в житті знання 🙂
Писати свого демона ми будемо на мові програмування Python.


Для написання демона під Linux знадобляться модулі sys, os, time і
signal, які входять в стандартну поставку. Базові поняття про
Python можна почерпнути на www.python.ru/docs/. Отже, якщо ви трохи
орієнтуєтеся в мові, створюємо файл daemon.py і пишемо:


У файл myvar.py для зручності користування винесемо налаштування демона
(Розташовується цей файл там же, де і наш майбутній демон). В
більшості лінукс-систем за замовчуванням каталог / var / tmp доступний для
записи, тому використовуємо його. Втім, ніхто не заважає вам
використовувати / tmp або домашній каталог. Тому створюємо цей файл і
пишемо туди наступне:


Продовжуємо писати нашого демона (переходимо назад до
редагування файлу daemon.py). Перевіряємо, запущений ні наш демон
безпосередньо і якщо так, то запускається:


У щойно написаних трьох рядках викликають дві
функии – startstop і test. Їх у нас поки немає, але ми їх зараз
розглянемо. test – це робоча функція демона. Тобто саме
тут ми будемо писати всі ті дії, які наш демон повинен
виконувати. Але оскільки наш демон загалом нічого виконувати не
повинен, то він буде через певний нами в конфігураційному файлі
(Ще пам'ятаєте файлик – myvar.py, який ми тільки що
створювали?) час прокидатися і записувати поточний час і
колічествово пробуджень в файл:


Функцію записуємо зверху (до) записаних раннє рядків. Тепер
подивимося на нашу другу функцію – startstop. Вона використовується
для аналізу параметрів командного рядка, визначення поточного
стану демона (запущено / не запущений) і виклику основної функції по
створення демона. Спочатку перевіряється довжина переданого скрипту
аргументу.


• Якщо вона більше 1 – демон намагається відкрити pid файл
(Файл, у котрому записаний номер процесу). Якщо файлу немає, то
генерується виняток і змінної pid присвоюється значення
None.


• Якщо демону переданий аргумент stop або restart, то в разі
відсутності pid файлу демон повідомляє про це, і здійснюється
вихід з функції. Якщо ж все нормально, то намагаємося закрити
процес, зазначений у pid файлі, і встановлюємо час виконання
даної операції в 1 секунду. Якщо ж виникає системна
помилка, то у випадку, якщо вона викликана відсутністю процесу, демон
видаляє pid файл і повністю зупиняється. Якщо ж яка-небудь
інша помилка, він пише цю помилку в лог файл.


• Якщо демону переданий аргумент start, то демон спочатку
перевіряє, чи існує pid. Якщо так, то демон каже, що процес
вже існує, і виходить. Інакше запускається безпосередньо функція
демонізірованія 🙂


• Якщо ж демон запущений без параметрів, то виводяться
параметри для запуску і демон виходить з себе 🙂


В самому кінці коду використовується ще одна Фунція – deamonize.
Що ж вона робить? А вона, власне, і створює нашого демона.


Для створення демона зі звичайного процесу використовується так
званий double magic fork (Подвійний магічний форк) –
тобто процес спочатку породжує свою псевдонезавісімую копію,
яка потім породжує себе ще раз, тим самим звільняючись від
породив процес терміналу, оскільки при закритті терміналу по
замовчуванням закриваються і породжені ним процеси. Крім цього
проводиться зміна директорії за замовчуванням для звільнення від
оточення. Розберемо цей процес детальніше:


* Демон– Програма, яка виступає в ролі служби ОС.


** Мова програмування Python був так названий своїм
творцем Гвідо ван Россум на честь літаючого цирку Монті Пайтона.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*