Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

Re: Как определить, что приложение (скрипт) зависло?

Дата публикации: 07-08-2026 09:22:59


Цитата: alixey от 05 Августа 2026, 22:29:25Но иногда запрос к БД зависает на неограниченное время.Значит, не выставлены таймауты.EvangelionDeath, какой именно таймаут игнорируется? Их там тонна. Я да...


Основное содержимое страницы с новостью.

Автор Тема: Как определить, что приложение (скрипт) зависло?  (Прочитано 960 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн alixey

Есть скрипт на PHP, который в цикле делает определенный набор действий.
Скрипт демонизирован примерно так:

К нему есть скрипт-монитор, который перезапускает демона, если тот не отвечает или отсутствует (например вылетел из-за ошибки).
Но вот если скрипт просто завис (а такое изредка случается при запросе к базе данных, несмотря на таймауты), то он это не обнаруживает, и основной скрипт-демон не функционирует, хотя и запущен.
Как можно отслеживать подобные зависшие процессы? Они не жрут память или CPU, внутри скрипта они просто ждут результат вызова функции.


Оффлайн Peter_I

alixey, если скрипт завис, то он также и не отвечает тому демону. Или как всё организовано?


Оффлайн F12

alixey, первым делом нужно смотреть статус процесса предположительно зависшего приложения или скрипта

  ... проще всего это делается с помощью htop, смотри колонку S, если процесс имеет статус D или Z, а значение в колонке TIME+ не меняется (подробности смотри в выхлопе man htop), то это уже с большой вероятностью может указывать на то, что приложение (скрипт) таки зависло


Оффлайн Peter_I

F12, из демона это неудобно анализировать. Если это делать, то не проще будет ps?


Оффлайн EvangelionDeath

alixey, а сделать через heartbeat. Взять файлик и обновлять тайм метки. А мониторингом смотреть тайм метки. И если время изменения метки больше допустимого — считать, что ваш демон "завис"

HP Pro 840G6: Intel i5-8365U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / CachyOS
HP Pro 840G6: Intel i5-8265U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / Ubuntu 24.04


Оффлайн Peter_I

EvangelionDeath, диск использовать нежелательно. И есть же средства межпроцессного взаимодействия.


Оффлайн EvangelionDeath

function _sig($sig)
{
    global $_clock, $_cfg, $_run, $log;
    switch ($sig) {
        case SIGALRM:
            $log->err("{$_cfg['name']} - watchdog: итерация превысила{$_cfg['max_iteration']}s", null);
            exit(1); // монитор увидит мертвий процес и перезапустит
        case SIGTERM:
            ...
    }
}

Асинхронная доставка сигналов

pcntl_async_signals(true); // PHP >= 7.1, вместо declare(ticks=1)

### Alarm

while ($_run['flag']) {
    pcntl_alarm($_cfg['max_iteration']); // напр. 15 сек
    // ... основная работа демона ...
    pcntl_alarm(0); // охрана, отмена
    _heartbeat();
    usleep($_cfg['sleep']);
}


Из сервисов, что рабоают в качестве демона - только Whois server написан на PHP, так как не свойственно этому языку такой режим работы)

« Последнее редактирование: 05 Августа 2026, 16:50:46 от EvangelionDeath »

HP Pro 840G6: Intel i5-8365U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / CachyOS
HP Pro 840G6: Intel i5-8265U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / Ubuntu 24.04


Оффлайн F12
не проще будет ps?

- не очень внимательно читал вопрос, ты прав, отслеживать статус конкретного процесса проще будет с ps, нужно только добавить в скрипт-монитор соответствующую процедуру 


Оффлайн AnrDaemon

1. Если скрипт просто завис на запросе в БД, он не использует ни память, ни CPU.
2. Чтобы скрипт не зависал, надо выставлять правильные таймауты.
3. Чтобы проверить, что скрипт не висит и вообще может принять сигналы, ему шлют 0.
4. Чтобы точно знать, что скрипт не висит и вообще работает, ему на отдельный сигнал настраивают конкретную реакцию.

Например, на USR1 печатать в лог "ой!"


Из сервисов, что рабоают в качестве демона - только Whois server написан на PHP, так как не свойственно этому языку такой режим работы)

Если это WHOIS сервер, я сомневаюсь, что он работает с "базой данных". Скорее, он работает с каким-то удалённым сервером через curl. Для curl надо ВСЕГДА выставлять CONNECTTIMEOUT. Иначе при падении линии он может зависать до того, как включается read timeout.

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Оффлайн alixey
2. Чтобы скрипт не зависал, надо выставлять правильные таймауты.

Таймауты выставлены и обычно работают.
Но иногда запрос к БД зависает на неограниченное время.
Процесс при этом не зомби, нет утечки памяти или утилизации CPU, просто бесконечный цикл ожидания.

Обновлять таймстамп на файле я думал, но такое решение не нравится.
А вот ответ на сигнал 0 попробую добавить.


Оффлайн EvangelionDeath

AnrDaemon, Именно Whois-сервер, именно работает с БД.

alixey, если у Вас БД MySQL/MariaDB, то в последних версиях PHP (с 7 вроди), таймаут игнорируется. И даже если и работает, то он работает только на установку соединения и write - то есть отправку запроса, при read - таймаут вообще никогда не учитывается.

HP Pro 840G6: Intel i5-8365U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / CachyOS
HP Pro 840G6: Intel i5-8265U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / Ubuntu 24.04


Оффлайн alixey

У меня Oracle с драйвером OCI8, он не особо обновляется.


Оффлайн EvangelionDeath

alixey, ще раз обратите внимание: если пхп уже ожидает чтение из БД, то уже не распространяются лимиты по времени.

HP Pro 840G6: Intel i5-8365U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / CachyOS
HP Pro 840G6: Intel i5-8265U, 64GB DDR4, Intel 620, Samsung 990Pro 1TB / Ubuntu 24.04


Оффлайн AnrDaemon
Но иногда запрос к БД зависает на неограниченное время.

Значит, не выставлены таймауты.

EvangelionDeath, какой именно таймаут игнорируется? Их там тонна. Я даже на память сейчас их не назову. Надо смотреть в доки PHP и БД.

Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…


Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1Re: Как определить, что приложение (скрипт) зависло?07.1606-08-2026
2Linux наконец-то не тормозит или пятничный релакс013.1807-08-2026
3Xubuntu 24.04: завершение сеанса вместо выключения после ждущего режима015.8209-08-2026
4Пропали эмодзи в системе05.7505-08-2026
5Посоветуйте серверный дистр для VDS с одним гигом08.2107-08-2026
6И вновь уроки про deadlock-и0525-06-2026
7На каком дистрибутиве строить?05.8607-08-2026
8Что хуже — необновлённый софт или свежие бекдоры?010.8907-07-2026
9Раньше было лучше. На самом деле нет.06.7607-08-2026
10Re: Новая жизнь с Plasma6 в Kubuntu012.8408-08-2026

Классификация: Мнения. Схожих патентов: 0. Схожих новостей: 10. Тональность: 0. Информативность: 12.98. Источник: forum.ubuntu.ru.