alixey, ще раз обратите внимание: если пхп уже ожидает чтение из БД, то уже не распространяются лимиты по времени.
Автор
Тема: Как определить, что приложение (скрипт) зависло? (Прочитано 961 раз)
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']);
}
« Последнее редактирование: 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 и БД.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.
Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Re: Как определить, что приложение (скрипт) зависло? | 0 | 12.98 | 07-08-2026 |
| 2 | Comments: ОВК | 0 | 10 | 15-05-2026 |
| 3 | В Свердловской области временно приостановили прием документов в МФЦ | 0 | 0 | 10-01-2022 |
| 4 | В работе приложения Альфа-банка произошел сбой | 0 | 0 | 24-07-2025 |
| 5 | Clipboard just randomly stops working | 0 | 3 | 29-06-2026 |
| 6 | Comments: ОВК | 0 | 6.94 | 23-06-2026 |
| 7 | Сайты МВД были не доступны из-за сбоя | 0 | 0 | 06-03-2025 |
| 8 | В работе "ВКонтакте" произошел сбой | 0 | 0 | 28-08-2019 |
| 9 | A note for readers | 0 | 0 | 26-03-2025 |