LINUX.ORG.RU

Как узнать, почему падает php скрипт?

 ,


0

2

Мне нужно, чтобы машина выполняла php скрипт в фоновом режиме с ограничением по CPU. Запускаю в таком виде: nohup php -f /var/www/website/script.php based10 10000000000 > based10.log 2>&1 & cpulimit -p 1491 -l 60 -b

В какой-то момент (10, 20, 30 минут) скрипт перестаёт работать. До этого скрипт проработал 58 дней без ошибок, затем была перезагрузка системы. После перезагрузки скрипт был запущен снова, но через 20 дней упал с ошибкой:

nohup: ignoring input
123PHP Fatal error:  Uncaught PDOException: SQLSTATE[08S01]: Communication link failure: 1053 Server shutdown in progress in /var/www/website/script.php:62
Stack trace:
#0 /var/www/website/script.php(62): PDOStatement->execute()
#1 {main}
  thrown in /var/www/website/script.php on line 62
<br />
<b>Fatal error</b>:  Uncaught PDOException: SQLSTATE[08S01]: Communication link failure: 1053 Server shutdown in progress in /var/www/website/script.php:62
Stack trace:
#0 /var/www/website/script.php(62): PDOStatement-&gt;execute()
#1 {main}
  thrown in <b>/var/www/website/script.php</b> on line <b>62</b><br />

на 62 строке находится обращение к БД: $stmt->execute([$data]);

Сейчас скрипт падает без ошибки. Просто перестаёт работать и всё.

В based10.log пусто. В mysql/error.log пусто.

Где мне ловить ошибку и понять, в чём причина падения скрипта?



Последнее исправление: accountnujen (всего исправлений: 1)

У меня есть подозрения, что не все экземпляры задачи запуска php с помощью nohup завершаются, из-за чего продолжают висеть в памяти, и наступает какой-то момент, когда памяти уже ни на что не хватает.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Infra_HDC

памяти очень много (24гб). Когда скрипт работал 2 месяца я мониторил память. Не загружалась она сильно. когда скрипт пропадает - в htop этого процесса нет

accountnujen
() автор топика
Последнее исправление: accountnujen (всего исправлений: 2)
Ответ на: комментарий от accountnujen

дело не в размере кучи, а в том, что например некоторые области системной памяти могут стать переполненными, например отвечающие за максимальное количество процессов. вот я о чём.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Dimez

ни на какие мысли не наводит?

я бы очень хотел, чтобы наводило, но я не понимаю при каких обстоятельствах может появиться данное сообщение. Гугл говорит, что у людей падает это при резервном копировании. У меня нет резервного копирования…

accountnujen
() автор топика
Ответ на: комментарий от Infra_HDC

дело не в размере кучи, а в том, что например некоторые области системной памяти могут стать переполненными, например отвечающие за максимальное количество процессов. вот я о чём.

дело в том, что я редко использую больше 2гб вообще. На данный момент запущен этот скрипт, другой скрипт через systemd, nginx, openvpn - занято 845мб. процессов у меня много тоже не бывает. разумеется, мои понимания на тему «много» крайне поверхностны. Давайте проверим ваше предположение. Сколько может быть и сколько - много?

accountnujen
() автор топика
Последнее исправление: accountnujen (всего исправлений: 1)
Ответ на: комментарий от Anoxemian

Тебе с точностью до команды дано место ошибки. Ты о каких то левых материях рассуждаешь. Что не так то? О_о

2 месяца работало. потом ещё 3 недели. Как понять, почему сейчас не работает? Опять же, если бы ты внимательно прочёл вопрос, то понял бы, что ошибка была в прошлый раз и она появилась единожды. На данный момент никаких ошибок нет, но и работы тоже. Ты мне скажи, куда именно смотреть, чтобы узнать текущую ошибку?

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

Смотри, решается двумя задачами: 1. корректно обработать исключение, дождаться ответа субд и продолжить работу скрипта. 2. выяснить пртчину потери связи/кто рестартует субд.

Первое - пара десятктов строк кода, второе - анализ и исправление ситуации.

Anoxemian ★★★★★
()
Ответ на: комментарий от accountnujen

Ну а про текущее положение про тихий отвал - раскидай влертов потомониторь связь ну вобщем точную инструкцию про неизвестный скрипт в неизвестном окружении как тебе дать? Пробуй головой, вариантов нет.

Anoxemian ★★★★★
()
Ответ на: комментарий от accountnujen

Гугл говорит,

Гугл не нужен, примени англо-русский переводчик. Там всё максимально понятно объяснено в тексте ошибки, и нечего уточнять.

что у людей падает это при резервном копировании

Такие же не умеющие читать.

firkax ★★★★★
()
Ответ на: комментарий от accountnujen

А, я невнимательно прочёл. А зачем ты её написал вообще в теме тогда? И даже обсуждать начинаешь, а потом вдруг говоришь что она тут ни при чём. Только запутываешь всех.

Поставь в начало скрипта

ini_set('display_errors',true);
error_reporting(-1);

может быть у тебя отключён показ каких-нить ошибок.

Ну а вообще это может быть и штатный exit где-то в скрипте, может быть с записью лога в ещё какой-то файл, если так то без самого скрипта сложно найти.

А ещё - где ты его запускаешь? Если это шаред хостинг, то там могут быть лимиты на время работы процесса.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

А зачем ты её написал вообще в теме тогда?

Базам свойственно ломаться? Просто последний нормальный запуск закончился вот такой ошибкой. Все последующие запуски не проработали и дня.

Поставь в начало скрипта

вот так у меня

ini_set("display_errors", 1);
ini_set("track_errors", 1);
ini_set("html_errors", 1);
ini_set('memory_limit', '8024M');
ini_set('max_input_vars',15000);
error_reporting(E_ALL);
set_time_limit(0);
ignore_user_abort(true);

штатный exit где-то в скрипте

2 месяца работал, потом 2 недели. какой exit тут может быть?

А ещё - где ты его запускаешь? Если это шаред хостинг

VDS. лимиты я никакие не ставил.

accountnujen
() автор топика

на 62 строке находится обращение к БД: $stmt->execute([$data]);
В based10.log пусто. В mysql/error.log пусто.

Почти уверен, что в $data что-то некорректное, ну и ты в try catch это не обернул/

easybreezy
()
Ответ на: комментарий от accountnujen

2 месяца работал, потом 2 недели. какой exit тут может быть?

Принцип работы скрипта ты не описал, но подозреваю что он обрабатывает какие-то данные.

Раз скрипт работал долгое время, а потом перестал - значит (скорее всего) во входящих данных попалось что-то, что твой скрипт неверно обрабатывает. А т.к. раньше у тебя такого не было, то и обработку такого поведения ты в этом скрипте не учел, погугли что-нибудь https://rollbar.com/blog/php-pdoexception/#

У меня с постгресом такое же бывает, потому что мне лень входные данные иногда валидировать нормально.

easybreezy
()
Ответ на: комментарий от accountnujen

VDS

И база на нём же, и при этом самовольно в shutdown ушла? Посмотри её логи за то время, может что-нить интересное найдёшь. Хотя может быть это автообновления какие.

2 месяца работал, потом 2 недели. какой exit тут может быть?

Ну, раньше проблем не было, а теперь появились, вот и заработала какая-то ветка кода где молчаливый exit стоит.

А ещё, сразу не заметил.

nohup php -f /var/www/website/script.php based10 10000000000 > based10.log 2>&1 & cpulimit -p 1491 -l 60 -b

1) твои редиректы логов не работают как надо, ищи файл nohup.out вместо них

2) что такое 1491?

3) попробуй запустить без nohup, без редиректов и без & просто в консоли, посмотри чем закончится

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ну, раньше проблем не было, а теперь появились, вот и заработала какая-то ветка кода где молчаливый exit стоит.

файлик один. нет веток.

  1. твои редиректы логов не работают как надо, ищи файл nohup.out вместо них

в файлы выводится инфа. у меня в начале скрипта ‘echo «123»;’ Я его вижу в лог файле

  1. что такое 1491?

pid, который я режу. динамическое значение. не через & у меня запуск.

  1. попробуй запустить без nohup, без редиректов и без & просто в консоли, посмотри чем закончится

запуск: 2023-02-05 00:14:30 окончание: 2023-02-05 01:36:56 длительный процесс.

последние 5 запусков длились около часа…

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

давайте попробую перефразировать вопрос: можно ли узнать, причину смерти процесса? вот к примеру я запускаю процесс, затем его убиваю через htop. Будет ли где-нибудь записана информация, что пользователь такой-то, в моём случае «root», в такое-то время убил процесс собственноручно?

accountnujen
() автор топика
Ответ на: комментарий от accountnujen

запуск: 2023-02-05 00:14:30 окончание: 2023-02-05 01:36:56 длительный процесс.

Ну полтора часа то можно и подождать, какие проблемы? Если страдаешь от разрывов инета, можно запустить bash в screen-е и оттуда уже твой скрипт.

можно ли узнать, причину смерти процесса? вот к примеру я запускаю процесс, затем его убиваю через htop. Будет ли где-нибудь записана информация,

Да, если ты запустишь его в баше без редиректов и ухода в фон, как я тебе писал, то при завершении он напишет причину (если она нештатная).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Да, если ты запустишь его в баше без редиректов

Мне эта идея не нравится из-за закона подлости: 2023-02-05 02:40:54 - 2023-02-05 05:47:02 (и выполнение продолжается)

Ну не хочет он вырубаться… другие способы есть? Может как-то иначе можно логировать? Я логирую скрипт, то есть вывод скрипта, в котором нет ошибок. Ошибка или на уровне nohup, или на уровне cpulimit, или на уровне php, но не в синтаксе, или на уровне mysql (но почему-то не пишется в лог mysql). Учитывая, что если действительно виноват mysql, то хоть какая-нибудь ошибка была в выводе php.

Допустим я долб**б и это я перезагрузил тогда машину, но забыл это, поэтому ошибка возникла по моей вине. Ситуацию это никак не улучшает…

accountnujen
() автор топика
Последнее исправление: accountnujen (всего исправлений: 1)