Ruby daemon, або як зробити демона на рубі
Інженер із поетичною душею
Ruby daemon, або як зробити демона на рубі
Іноді в процесі роботи з різними сторонніми бібліотеками, які містять важкі блокуючі методи, не обійтися звичайним Thread. У такому разі на допомогу приходять демони :) Ось кілька прийомів, які я освоїв у роботі з ними.
Базовий механізм
Запустити демона можна за допомогою методуKernel.fork, передавши йому блок. Метод повертаєpid процесу, який можна записати у файл і просто використати надалі.
Визначення статусу
Я не знайшов зручного способу визначення методами рубі, чи процес запущений. Є можливість фільтрувати висновокps ax, шукаючи в ньомуpid процесу. Але є методProcess.waitpid, який можна використовувати хитро. Також для майбутніх завдань, запакуємо наш код у клас:
Повідомлення про помилки
Припустимо, що в нашого демона є деякий процес ініціалізації, і ми хочемо знати, чи завершився він чи сталася помилка до того, як залишимо метод Daemon.start.
Для передачі подібних повідомлень добре підходитьIO.pipe. Для двостороннього спілкування потрібно створювати два канали, але нам вистачить і одного:
У кожного демона (для цього вони зазвичай і створюються) є циклічна частина. Нам хотілося б запускати та зупиняти процес тоді, коли нам потрібно. Якщо із запуском все зрозуміло, то для зупинки буде потрібна ще одна річ. Адже в той момент, коли ми створили демона, він створює копії всіх змінних і подальша їх зміна всередині та зовні демона стає незалежною. Ще один спосіб спілкування з демоном -сигнал :
Тепер, якщо успадкувати від цього класу свій клас і перевизначити методи initialize і main_loop, вийде цілком демон :)
Для самостійного вивчення
Є, звісно, ще недоліки. Наприклад:
- Якщо помилка виникає в main_loop, канал виведення вже закритий. А якщо не закривати канал, то методIO#read не дозволить нам вийти з методу start. Що робити?
- Якщо потрібно періодично спілкуватися з демоном об'ємними інформацією, що робити? (я у своїй задачі використавTCPSocket, але це, адже, не панацея)
- Добре було б зберігатиpid в pid-файлі у разі нашестя зомбі. І, відповідно, обробляти зомбо-проблеми, що виникають.
Але це я залишу на самостійне рішення допитливим читачам.