LINUX.ORG.RU

Внезапно останавливаются скрипты

 , ,


0

2

Есть консольные php скрипты, их объединяет наличие в них react-loop и addPeriodicTimer()

$loop = React\EventLoop\Factory::create();
$loop->run();


Раньше работало как часы сутками и неделями без перезапуска, но сейчас заметил что скрипты начали внезапно останавливаться. Никаких ошибок нет, ни в stdout ни в логах(логи пишутся в /var/logs/php-error.log). В конце скриптов есть echo «exit\n»; т.е. можно определить что скрипт закончил жизнь своим естественным путем, но и этого вывода я не вижу. Скрипты ведут ещё свои логи, весь вывод пишется в файл.
Запускаю я их просто
setsid sudo -u gobot php /var/www/cli/server.php > /var/log/server.log &

Заметил одну вещь, после запуска скрипта он прекращает работу через пол часа, иногда через час, а иногда через 15 минут, даже если его запускать не в фоне и он выводит все на консоль. Просто вот так просто останавливается и все. Но почему в конце нет вывода «exit»... Если скрипт запустить второй раз, то он будет работать так же сутками и не останавливается. Я уже не знаю где смотреть и как отловить в каком месте идет прерывание

★★★★

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

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

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

Скрипт консольный, там нет ограничений, к тому же сервер выделенный, а не vds. Сейчас установил

pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");

Посмотрю что в выводе будет...

gobot ★★★★
() автор топика
Ответ на: комментарий от deep-purple

Да, это годная функция, даже на exit реагирует

gobot ★★★★
() автор топика

Запускаю я их просто
setsid sudo -u gobot php /var/www/cli/server.php &

Не видно, куда у вас заворачивается выхлоп команды php.
Добавьте, что ли,

>/tmp/server.log 2>&1

Кстати, systemd-run позволяет этих костылей избежать.

ArcFi
()
Ответ на: комментарий от anonymous

Уже пробовал неоднократно.
УМВР, включая PHP-скрипты, и с логированием проблем нет.

ArcFi
()

Добавил register_shutdown_function(), подождал 1.5 часа - скрипт снова упал и снова не понять из-за чего. В выводе нет ни «exit», и register_shutdown_function не сработала. В логах так же пусто... Я уже не знаю где ковырять. Даже если где в скриптах и зарыто было exit, то register_shutdown_function сработало бы и вывело на консоль и логи сообщение, но ни того ни другого нет. Если fatal error была, то то же в логах /var/log/php_errors.log было сообщение, но ничего этого нет! В syslog тоже ничего подозрительного.

Вот срань господня!

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

sudo -u gobot
/var/log/server.log - вот туда идет вывод

Убедитесь, что у юзера gobot есть RW-доступ к этому файлу.
А также монопольный доступ к логам при перенаправлении stdout/stderr.

ArcFi
()
Ответ на: комментарий от gobot

Помониторьте свободную оперативку.
Возможно, в какой-то момент скрипт начинает её кушать не в себя и попадает под раздачу.
Также можно сделать bash-обёртку в которой проводить дополнительные проверки статусов выполнения дочерних скриптов или команд.
Кроме того, можно поэкспериментировать с иными вариантами фонового выполнения, как то disown, nohup, screen, etc.

ArcFi
()

strace, gdb

anonymous
()
Ответ на: комментарий от ArcFi

Точно не из-за фона, потому что в консоле он также останавливается. Попробовал с strace запустить...

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

Верно? Нужно теперь подождать

Не совсем, но сойдёт. Я предлагал запустить с включённой трассировкой в xdebug. strace слишком низкоуровневый, хз что там получится выудить из мегабайтов трейса.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

srtace в моем случае совсем мало выводит в начале и почти ничего не выводит когда скрипт работает. По завершению скрипта хоть показывает код завершения

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

имеет смысл добавить вывод в файл

anonymous
()
Ответ на: комментарий от no-such-file

Вот что выдал strace

) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=22723, si_uid=1000, si_status=SIGKILL, si_utime=534, si_stime=144} ---
write(8, "\21", 1)                      = 1
rt_sigreturn()                          = -1 EINTR (Interrupted system call)
poll([{fd=6, events=POLLIN}], 1, 4294967295) = 1 ([{fd=6, revents=POLLIN}])
read(6, "\21", 1)                       = 1
wait4(22723, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WNOHANG|WSTOPPED, NULL) = 22723
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
getuid()                                = 0
open("/etc/login.defs", O_RDONLY)       = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=10478, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fabd8043000
read(4, "#\n# /etc/login.defs - Configurat"..., 4096) = 4096
read(4, " issuing \n# the \"mesg y\" command"..., 4096) = 4096
read(4, "It supports passwords of unlimit"..., 4096) = 2286
close(4)                                = 0
munmap(0x7fabd8043000, 4096)            = 0
sendto(9, "<86>Oct 26 13:09:33 sudo: pam_un"..., 79, MSG_NOSIGNAL, NULL, 0) = 79
socket(PF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 4
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
sendto(4, "x\0\0\0R\4\5\0\4\0\0\0\0\0\0\0op=PAM:session_c"..., 120, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 120
poll([{fd=4, events=POLLIN}], 1, 500)   = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "$\0\0\0\2\0\0\0\4\0\0\0\304B,\377\0\0\0\0x\0\0\0R\4\5\0\4\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
recvfrom(4, "$\0\0\0\2\0\0\0\4\0\0\0\304B,\377\0\0\0\0x\0\0\0R\4\5\0\4\0\0\0"..., 8988, MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
close(4)                                = 0
socket(PF_NETLINK, SOCK_RAW, NETLINK_AUDIT) = 4
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
sendto(4, "t\0\0\0P\4\5\0\5\0\0\0\0\0\0\0op=PAM:setcred a"..., 116, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 116
poll([{fd=4, events=POLLIN}], 1, 500)   = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "$\0\0\0\2\0\0\0\5\0\0\0\303B,\377\0\0\0\0t\0\0\0P\4\5\0\5\0\0\0"..., 8988, MSG_PEEK|MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
recvfrom(4, "$\0\0\0\2\0\0\0\5\0\0\0\303B,\377\0\0\0\0t\0\0\0P\4\5\0\5\0\0\0"..., 8988, MSG_DONTWAIT, {sa_family=AF_NETLINK, pid=0, groups=00000000}, [12]) = 36
close(4)                                = 0
munmap(0x7fabd5a0c000, 2204800)         = 0
munmap(0x7fabd57d5000, 2318848)         = 0
munmap(0x7fabd55d3000, 2101304)         = 0
munmap(0x7fabd53d1000, 2101328)         = 0
exit_group(137)                         = ?
+++ exited with 137 +++


Как я понимаю «exited with 137» kill -9? Т.е. кто-то завершил мой скрипт извне?

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

кто-то завершил мой скрипт извне?

предположение - таким не брезгует systemd

anonymous
()
Ответ на: комментарий от no-such-file

Лимитов нет никаких, сервер выделенный, мощный. Я предполагаю завершался скрипт другим моим скриптом неправильным, который завершал процессы

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

Лимитов нет никаких

А если проверить?

php -i | grep memory_limit

ArcFi
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.