1

Тема: Моніторинг роботи скрипту

Коротше задачка for fun.
Припустимо є PHP-скрипт, який працює дуже довго ( >24 годин). Його можуть кілити, може сам здихати по незрозумілих причинах, можуть сервер перезавантажувати і т.п.

Треба моніторити чи він працює, якщо ні перезапускати.

Думаю це зробити через getmypid (враховуючи запуск буде з консолі то id процесу буде незмінне протягом всієї роботи, але треба перевірити) + кронівський скриптик який чекатиме чи процес живий.

Можливо хтось стикався з таким, і знає вже готові, більш прикольніші рішення?
Або хто не стикався запропонує своє бачення організації такого моніторингу?

2

Re: Моніторинг роботи скрипту

Можна поставити скрипт у крон на виконання кожної хвилин. У скрипті зробити перевірку.
Якщо скрипт запущений - нічого не робимо.
Можна писати самопальний скрипт або юзати http://symfony.com/doc/current/componen … ndler.html - symfony lock компонент.


ps aux | grep myscript.php | wc -l 

дописуємо тут команду для того що якщо 1 рядок - рестартимо скрипт і додаємо команду у крон.

Я б юзав Lock component ;)

Подякували: ailkiv1

3

Re: Моніторинг роботи скрипту

Ок, доповню умову, скрипт приймає аргумент, і запускається на фонове виконання з різними параметрами, одночасно декілька копій

4

Re: Моніторинг роботи скрипту

Варіант 1н. Поставте декілька цих скриптів у крон і генеруйте ключ до lock файлу в залежності від ваших умов.

$key =  'script_lock'.$this->getArgumentsAsLine();
# дальше умова: якщо є такий лок тоді нічого не робимо - якщо немає - стартуємо 

Варіант два: напишіть 1н скрипт який чекає чи інші запущені і якщо ні запускає її з різними аргументами ;) Або навіть запускає сам себе з певними параметрами

5

Re: Моніторинг роботи скрипту

# дальше умова: якщо є такий лок тоді нічого не робимо - якщо немає - стартуємо

Якщо я правильно зрозумів, погана ідея. Виходить локи мають додаватися на початку скрипту і видалятися при завершені (крешу або успішному). І це видалення є непевна ланка. Припустимо сервер вирубили чи процес кільнули, тоді лок не буде викинутий із списку і скрипт знов не стартане бо ключ буде у списку

6

Re: Моніторинг роботи скрипту

Тут ви праві. Як варіант можна у скрипті по особливому чекати чи він запущений. для прикладу через той же px | aux
перевага у такому підході у тому що ви ставите скрипт у кроні і він самодостатній. Не треба думати як його стартувати і коли. Все в 1нму скрипті ;)

7

Re: Моніторинг роботи скрипту

$command = 'ps aux | grep -i "'.$this->getChildName().' '.$record['id'].'$" | grep -v grep ';
                exec($command,$op);
                if ( is_array($op) && count($op) > 0 ) {
                    //child already running
                }

$record['id'] - айді дочірнього скрипта, якщо треба кілька копій запускати. для запуску скрипта ця ід потім йде як параметр.

exec("php index.php ".$this->getChildName()." ".$record['id']." > /dev/null &");

8

Re: Моніторинг роботи скрипту

Розумію що тут пару рядків коду, але цікаво може хтось для цього використовував якесь вже готове ПЗ, яке бере на себе функції моніторингу, має різні налаштування і т.п.

9

Re: Моніторинг роботи скрипту

Убунтовський upstart,
http://supervisord.org
Можна ще systemd приспособити під такі нужди, але  я не пробував. https://coreos.com/docs/launching-conta … h-systemd/

Подякували: ailkiv1

10

Re: Моніторинг роботи скрипту

А ви дивились на ReactPHP, не підходить?

11

Re: Моніторинг роботи скрипту

ktretyak написав:

А ви дивились на ReactPHP, не підходить?

Конкретно по цій задачі не дивився у бік ReactPHP. Раніше трохи читав про його можливості.
Я не зовсім розумію, як ви бачите вирішення поставленої задачі через нього

12

Re: Моніторинг роботи скрипту

ailkiv написав:
ktretyak написав:

А ви дивились на ReactPHP, не підходить?

Конкретно по цій задачі не дивився у бік ReactPHP. Раніше трохи читав про його можливості.
Я не зовсім розумію, як ви бачите вирішення поставленої задачі через нього

Ваша задача:

Треба моніторити чи PHP-процес працює, якщо ні перезапускати.

Якщо прочитати коротенький опис тієї бібліотеки, що я дав, то можна побачити що там є вже код, який же начебто відповідає вашим вимогам:

What is it?
React is a low-level library for event-driven programming in PHP. At its core is an event loop, on top of which it provides low-level utilities, such as: Streams abstraction, async dns resolver, network client/server, http client/server, interaction with processes. Third-party libraries can use these components to create async network clients/servers and more.

The event loop is based on the reactor pattern (hence the name) and strongly inspired by libraries such as EventMachine (Ruby), Twisted (Python) and Node.js (V8).

Тобто дана бібліотека, серед іншого, дозволяє запускати постійний PHP-процес, і взаємодіяти з ним таким чином щоб підтримувати його постійність.

Хоча я глибоко не копав його, на перший погляд він може підійти, але не факт.

13

Re: Моніторинг роботи скрипту

По задачі потрібно не взаємодіяти із запушеним процесом, а моніторити чи він працює.
Якщо ReactPHP буде моніторити, тоді треба буде ще окремо монітори чи працює ReactPHP:)

14

Re: Моніторинг роботи скрипту

Що значить "чи працює ReactPHP"? Нагадаю - що ReactPHP це бібліотека, частина з якої вміє створювати постійний PHP-процес та підтримувати його "життя"...

15

Re: Моніторинг роботи скрипту

Давно читав за ReactPHP, зараз оновив трохи інфу. Він справді мабуть не зовсім те, що вимагає задача.

Задача ReactPHP, по-суті, зберігати ініціалізацію PHP-застосунка. Тобто він зберігає в пам'яті не просто PHP-процес, а й всю ініціалізацію... А це здається вже інше, не те що вам треба.