LINUX.ORG.RU

По какой причине systemd перестал запускаться?

 ,


0

1

Последний раз скрипт выполнялся 13 часов назад, хотя ошибок никаких нет. Как понять, в чём причина?

root@instance:~# systemctl status croncam.service
● croncam.service - Cam online
     Loaded: loaded (/etc/systemd/system/croncam.service; static; vendor preset: enabled)
     Active: active (running) since Fri 2022-07-15 02:25:12 MSK; 13h ago
TriggeredBy: ● croncam.timer
   Main PID: 107552 (bashtophp.sh)
      Tasks: 2 (limit: 28554)
     Memory: 9.3M
     CGroup: /system.slice/croncam.service
             ├─107552 /bin/bash /root/bashtophp.sh
             └─107553 php-cgi -f /var/www/website/public/cam2/camengine.php cron=true

Jul 15 02:25:12 instance systemd[1]: Started Cam online.
Jul 15 02:25:13 instance bashtophp.sh[107553]: <br>здратути<br><pre>Array
Jul 15 02:25:13 instance bashtophp.sh[107553]: (
Jul 15 02:25:13 instance bashtophp.sh[107553]:     [time] => 2022-07-15%2002:15:12
Jul 15 02:25:13 instance bashtophp.sh[107553]:     [status] => 0
Jul 15 02:25:13 instance bashtophp.sh[107553]: )



root@instance:~# systemctl status croncam.timer
● croncam.timer - Run every 10 minutes
     Loaded: loaded (/etc/systemd/system/croncam.timer; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-07-03 13:56:01 MSK; 1 weeks 5 days ago
    Trigger: n/a
   Triggers: ● croncam.service

Jul 03 13:56:01 instance systemd[1]: Started Run every 10 minutes.

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

service

[Unit]                                                                                                                                                                                                                                                            
Description=Cam online                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                  
[Service]                                                                                                                                                                                                                                                         
Type=simple                                                                                                                                                                                                                                                       
ExecStart=/root/bashtophp.sh

timer

[Unit]                                                                                                                                                                                                                                                            
Description=Run every 10 minutes                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                  
[Timer]                                                                                                                                                                                                                                                           
OnBootSec=1min                                                                                                                                                                                                                                                    
OnUnitActiveSec=10min                                                                                                                                                                                                                                             
Unit=croncam.service                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                  
[Install]                                                                                                                                                                                                                                                         
WantedBy=multi-user.target


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

отредактировал пост.

bash - это просто запрос на Php скрипт

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

вообще другая причина и не нужно связывать. ту проблему я нашёл и решил. Была нехватка памяти, потому что настройки в php и apache игнорировались и стояли дефолтные 128, а мне иногда требуется около 150.

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

Решил, о решении не отписал, не пометил тему как решенную, но завел новую почти точно такую же.

Ай, молодца!

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

Решил, о решении не отписал, не пометил тему как решенную, но завел новую почти точно такую же. Ай, молодца!

Выполнено, господин. Что с текущей проблем?

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

Твой скрипт завис, висит уже 13 часов и не завершается. Именно поэтому systemd и не запускает его снова.

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

Как узнать в чём проблема, чтобы так снова не произошло? Я смотрел лог apache2, лог error в папке с сайтом, лог croncam.service и croncam.timer. Где искать ошибку?

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

Прицепись к нему отладчиком, посмотри backtrace (bt).

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

Или самый простой и костыльный вариант - прибивай скрипт по тайм-ауту.

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

Он у меня висит уже 25 часов и я не хочу его перезапускать, не узнав, в чём была проблема. а как вот узнать - я не знаю. Подозрительно, что этой ошибки нет в логах apache2. К примеру, когда у меня была нехватка памяти (в начале нехватка места в хранилище, а затем нехватка оперативной памяти), то это можно было всё узнать из лога apache2, а сейчас он молчит. Подскажите, если в данный момент скрипт выполняется, можно ли как-нибудь вывести на экран на каком моменте у него вылезли проблемы?

Прицепись к нему отладчиком, посмотри backtrace (bt).

можете пожалуйста посоветовать мануал какой-нибудь, для чайников… Или этот bt делается при перезагрузке?

accountnujen
() автор топика
Ответ на: комментарий от accountnujen
# gdb -p 107553
(gdb) bt

Здесь 107553 - это PID твоего процесса, если скрипт еще не перезапущен, то он актуален.

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

Леннарт ушел, ну и вот.

Коммент месяца. =)))

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

Не хватает самого главного - вывода второй команды (bt). В gdb нужно было дать команду bt.

По идее, вот эта команда в gdb должна вывести имя текущей функции, на которой все встало:

print (char *)(executor_globals.function_state_ptr->function)->common.function_name

Но для этого нужно установить отладочные символы PHP. Гуглится, что в убунте это пакеты с суффиксами -dbg или -dbgsym. У меня нет убунты, и я не подскажу конкретной команды, как это сделать.

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

Не хватает самого главного - вывода второй команды (bt).

прошу прощения, пр**ался.

#0  fts_children (sp=0xffffda786d18, instr=2) at ../sysdeps/wordsize-64/../../io/fts.c:529
#1  0x0000ffff938efcc0 in fts_set (sp=0xffffda786d18, p=<optimized out>, instr=-629642264) at ../sysdeps/wordsize-64/../../io/fts.c:510
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
accountnujen
() автор топика
Ответ на: комментарий от accountnujen

В логах апача у тебя были ошибки связанные с тем, что апач пытался тебе отдать. А вот что не так с самим скриптом, запущенным через php-cli в логах апача отображаться не будет и не должно. Надо дебажить сам скрипт.

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

Скрипт читает/пишет файлы? Что-то из этого он сделать не может. Но я не спец в таком низкоуровневом дебаге.

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

Раз они не позволяют отпределить причину, значит, их мало или они стоят не в тех местах.

Нужно больше print’ов.

bigbit ★★★★★
()
Ответ на: комментарий от bigbit
root@instance-:~# ls -l /proc/107553/fd
total 0
lr-x------ 1 root root 64 Jul 16 09:49 0 -> /dev/null
lrwx------ 1 root root 64 Jul 16 15:03 1 -> 'socket:[2076049]'
lrwx------ 1 root root 64 Jul 16 15:03 2 -> 'socket:[2076049]'
lrwx------ 1 root root 64 Jul 16 15:03 3 -> '/tmp/.ZendSem.iFgs7R (deleted)'
lrwx------ 1 root root 64 Jul 16 15:03 4 -> /var/www/website/public/cam2/time.db
lrwx------ 1 root root 64 Jul 16 15:03 5 -> 'socket:[2076847]'
lrwx------ 1 root root 64 Jul 16 15:03 6 -> 'socket:[2076848]'
lrwx------ 1 root root 64 Jul 16 15:03 7 -> 'socket:[2074802]'

time.db - это файловая БД.

если вызвать команду ‘strace -p 107553’, то раз в секунду начнёт выдавать по 5 идентичных строк

oll([{fd=7, events=POLLIN}, {fd=5, events=POLLIN}], 2, {tv_sec=0, tv_nsec=435413804}, NULL, 0) = 0 (Timeout)
rt_sigaction(SIGPIPE, NULL, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTART}, 8) = 0
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTART}, NULL, 8) = 0
ppoll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, {tv_sec=0, tv_nsec=0}, NULL, 0) = 0 (Timeout)
rt_sigaction(SIGPIPE, {sa_handler=SIG_IGN, sa_mask=[PIPE], sa_flags=SA_RESTART}, NULL, 8) = 0

У меня была как-то проблема с записью time.db (из-за проблем с правами), но apache сообщал мне об этом. Это было в логах, а здесь тишина…

accountnujen
() автор топика
Ответ на: комментарий от accountnujen
root@instance-20211028-0318:~# lsof -i -a -p 107553
COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
php-cgi 107553 root    7u  IPv4 2074802      0t0  TCP instance-20211028-0318.subnet02820432.vcn02820432.oraclevcn.com:57350->85.***.***.197:1*** (ESTABLISHED)

Айпишник 85…. - это мой ip, который я каждые 10 минут опрашиваю

Поправьте меня: это сервер навернулся в 2 часа ночи? сам? И как от такого защититься?

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

Соединение в состоянии ESTABLISHED. Если бы сервер навернулся, TCP-соединение бы прервалось.

Я не понимаю, почему ты упорно не хочешь добавить отладочных printf’ов. Это так сложно?

Проблема судя по всему регулярно воспроизводится. Давно бы уже насовал printf’ов и определил строчку, на которой твой скрипт зависает.

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

Проблема судя по всему регулярно воспроизводится.

вот в том-то и дело, что во всех случаях ошибка всегда уходит в лог apache. А здесь apache пустой и в journalctl у service ничего нет. Вот если смотреть ls -l /proc/107553/fd , то там после подгрузки файла time.db идёт 3 socket. Дело в том, что в моём скрипте как раз идут 3 последовательных запроса, однако ВСЕ (!) они обособлены echo’ми и print_r. Вот яркий пример https://pastebin.com/ETVmdXsN . 1 и 2 запрос возвращают код 200, а 3 запрос код 400 (так должно быть). Раз уж было 3 socket, то следовательно 1 и 2 запросы были выполнены. Ну и почему тогда у меня нигде в логах не отображены? Ну или тогда я не понимаю, что такое printf. Можете пример привести?

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