LINUX.ORG.RU

Как можно понять, по какой причине systemd перестал выполнять операции?

 ,


0

1

Мне нужно было, чтобы сервер каждые 10 минут стучался к моей ip камере и проверял новые видео. У меня есть php файл, bash файл и 2 файла для systemd (service и timer) bash нужен лишь для того, чтобы он отправлял на php нужный запрос bashtophp.sh

#!/bin/bash

php-cgi -f /var/www/site/public/camera/camengine.php cron=true

croncam.service

Description=Cam online

[Service]
Type=simple
ExecStart=/root/bashtophp.sh

croncam.timer

Description=Run every 10 minutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=10min
Unit=croncam.service

[Install]
WantedBy=multi-user.target

Время от времени в логах у меня вылетает вот такая ошибка:

May 03 21:57:43 instance systemd[1]: /etc/systemd/system/croncam.service:1: Assignment outside of section. Ignoring.

В логах у меня она повторяется 80 раз. Никаких предпосылок нет. К примеру, 7-го числа эта ошибка была 5 раз под ряд, а 8-го её вообще не было, 9-го снова 3 раза, а 10-12-го тихо. И эта ошибка никогда не влияла на работу systemd. Он работал штатно. Вот пример лога в обычный день: journalctl -u croncam.service

...
Dec 18 02:16:08 instance bashtophp.sh[55047]: Bad Request!
Dec 18 02:16:08 instance bashtophp.sh[55047]: </pre><pre>ErrorBad Request!</pre><br><b>reqstat не OK. но возможно видео нет</b><br>конец выполнения
Dec 18 02:16:08 instance systemd[1]: croncam.service: Succeeded.
Dec 18 02:21:19 instance systemd[1]: /etc/systemd/system/croncam.service:1: Assignment outside of section. Ignoring.
Dec 18 02:21:36 instance systemd[1]: /etc/systemd/system/croncam.service:1: Assignment outside of section. Ignoring.
Dec 18 02:26:06 instance systemd[1]: Started croncam.service.
Dec 18 02:26:10 instance bashtophp.sh[56547]: <br>здратути<br><pre>Array
Dec 18 02:26:10 instance bashtophp.sh[56547]: (
Dec 18 02:26:10 instance bashtophp.sh[56547]: )
Dec 18 02:26:10 instance bashtophp.sh[56547]: </pre><br>СТАТУС<br><pre>Array
Dec 18 02:26:10 instance bashtophp.sh[56547]: (
Dec 18 02:26:10 instance bashtophp.sh[56547]:     [time] => 2022-18-12%2002:16:09
Dec 18 02:26:10 instance bashtophp.sh[56547]:     [status] => 0
Dec 18 02:26:10 instance bashtophp.sh[56547]: )
Dec 18 02:26:10 instance bashtophp.sh[56547]: </pre><br>ЗАПРОС ПРИНЯТ И БУДЕТ ОБРАБОТАН В ФОНОВОМ РЕЖИМЕ<br><br>поиск видео<br><br><h1>цикл 0</h1><br><br><h1>Лог</h1><br><pre>Array
# далее просто идёт работа скрипта
...

Но 3 мая у меня произошла такая сиутация: journalctl -u croncam.service

...
May 03 12:44:11 instance bashtophp.sh[459438]:                 )
May 03 12:44:11 instance bashtophp.sh[459438]:         )
May 03 12:44:11 instance bashtophp.sh[459438]: )
May 03 12:44:11 instance bashtophp.sh[459438]: </pre><br>вышли<br><br><h1>Операция успешно завершена</h1><br>
May 03 12:44:11 instance systemd[1]: croncam.service: Succeeded.
May 03 12:54:10 instance systemd[1]: Started croncam.service.
May 03 12:54:10 instance bashtophp.sh[459460]: <br>здратути<br><pre>Array
May 03 12:54:10 instance bashtophp.sh[459460]: (
May 03 12:54:10 instance bashtophp.sh[459460]: )
May 03 12:54:10 instance bashtophp.sh[459460]: </pre><br>СТАТУС<br><pre>Array
May 03 12:54:10 instance bashtophp.sh[459460]: (
May 03 12:54:10 instance bashtophp.sh[459460]:     [time] => 2022-05-03%2012:44:09
May 03 12:54:10 instance bashtophp.sh[459460]:     [status] => 0
May 03 12:54:10 instance bashtophp.sh[459460]: )
May 03 21:57:43 instance systemd[1]: /etc/systemd/system/croncam.service:1: Assignment outside of section. Ignoring.

тупо в May 03 12:54:10 скрипт остановился. Никаких ошибок нет, ничего нет. Когда я обнаружил это - в May 03 21:57 сделал запрос systemctl status croncam.service и там в графе Active было (кажется) waiting. Сейчас systemctl status croncam.service выглядит вот так: systemctl status croncam.service

root@instance:~# systemctl status croncam.service
● croncam.service
     Loaded: loaded (/etc/systemd/system/croncam.service; static; vendor preset: enabled)
     Active: inactive (dead) since Thu 2022-05-05 18:22:20 MSK; 7min ago
TriggeredBy: ● croncam.timer
    Process: 16292 ExecStart=/root/bashtophp.sh (code=exited, status=0/SUCCESS)
   Main PID: 16292 (code=exited, status=0/SUCCESS)

May 05 18:22:20 instance bashtophp.sh[16293]:                             [redirect_time_us] => 141566
May 05 18:22:20 instance bashtophp.sh[16293]:                             [starttransfer_time_us] => 300449
May 05 18:22:20 instance bashtophp.sh[16293]:                             [total_time_us] => 300591
May 05 18:22:20 instance bashtophp.sh[16293]:                         )
May 05 18:22:20 instance bashtophp.sh[16293]:                 )
May 05 18:22:20 instance bashtophp.sh[16293]:         )
May 05 18:22:20 instance bashtophp.sh[16293]: )
May 05 18:22:20 instance bashtophp.sh[16293]: </pre><br>вышли<br><br><h1>Операция успешно завершена</h1><br>
May 05 18:22:20 instance systemd[1]: croncam.service: Succeeded.
May 05 18:30:02 instance systemd[1]: /etc/systemd/system/croncam.service:1: Assignment outside of section. Ignoring.

Вот так выглдяит systemctl status croncam.timer systemctl status croncam.timer

root@instance:~# systemctl status croncam.timer
● croncam.timer
     Loaded: loaded (/etc/systemd/system/croncam.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2022-05-03 22:27:35 MSK; 1 day 20h ago
    Trigger: Thu 2022-05-05 18:32:19 MSK; 2min 35s left
   Triggers: ● croncam.service

May 03 22:27:48 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 03 22:30:10 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 04 03:57:50 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 04 03:57:51 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 04 03:57:52 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 04 03:57:52 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 04 03:57:53 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 05 06:23:37 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 05 06:23:37 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.
May 05 18:29:43 instance systemd[1]: /etc/systemd/system/croncam.timer:1: Assignment outside of section. Ignoring.

Теперь вопросы: Как узнать, почему 3 мая в 12 часов у меня остановился systemd? Что это за ошибка Assignment outside of section. Ignoring.? Как сделать, чтобы systemd не останавливался?

Это не похоже на cron.

mord0d ★★★★★
()

Как узнать, почему 3 мая в 12 часов у меня остановился

May 03 12:44:11 instance systemd[1]: croncam.service: Succeeded.
May 03 12:54:10 instance systemd[1]: Started croncam.service.

А это к скрипту вопросы, процесс сам завершился

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

А это к скрипту вопросы, процесс сам завершился

так он всегда так заканчивает. посмотрите декабрь 18

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

Assignment outside of section. Ignoring.

Печатает скрипт на русском что-то? Если да, то убери.

iljuase ★★★
()

Теперь вопросы: Как узнать, почему 3 мая в 12 часов у меня остановился systemd?

Скорее всего твой скрипт завис. Systemd-timer не запускает unit, если он уже запущен (не завершился).

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

И как не завершился?

May 03 12:44:11 instance systemd[1]: croncam.service: Succeeded.
May 03 12:54:10 instance systemd[1]: Started croncam.service

вот успешная остановка и запуск через 10 минут.

И как вот понять, если он зависает…. И что делать, чтобы не зависал…

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

Ну это скрипт надо смотреть, почему он завис.

php-cgi -f /var/www/site/public/camera/camengine.php cron=true

Тут так не скажешь, если он выхлоп не дал. Тут надо логирование включать и т.д. Дебажить. Может сетевая задержка и у скрипта нет таймаута на сеть, либо ещё что-то.

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

что подразумевается под фразой «включать логи и дебажить»? У меня php скрипт дебажится путём вывода текущих задач. Вот по сути мой дебаг:

<br>здратути<br><pre>Array
(
)
</pre><br>СТАТУС<br><pre>Array
(
    [time] => 2022-05-03%2012:44:09
    [status] => 0
)

Ладно, если бы у меня часто такие вылеты происходили, то я бы мог хоть какую-нибудь закономерность найти. Так нет. Это первый за 5 месяцев.

после status = 0 должна быть вот такая строка:

Dec 18 02:26:10 instance bashtophp.sh[56547]: </pre><br>ЗАПРОС ПРИНЯТ И БУДЕТ ОБРАБОТАН В ФОНОВОМ РЕЖИМЕ<br><br>поиск

но её нет

accountnujen
() автор топика
Последнее исправление: accountnujen (всего исправлений: 1)
Ответ на: комментарий от accountnujen
#!/bin/bash
timeout 9m php-cgi -f /var/www/site/public/camera/camengine.php cron=true

Можно типа этого сделать. Т.е. убивать твой php-скрипт через 9 минут, если он не завершился за это время.

Самый тупой вариант.

Ещё почитай про timeout. Можно типа

#!/bin/bash
timeout -k 10m 9m php-cgi -f /var/www/site/public/camera/camengine.php cron=true

Не силён в php, но лучше в самом коде добавить таймауты, если возможно.

iljuase ★★★
()
Последнее исправление: iljuase (всего исправлений: 2)
15 июля 2022 г.

Проблема была найдена и решена. Оказалось, что bash игнорирует настройки в php.ini и apache.ini, которые отвечают за memory_limit. Несмотря на мои «безлимитные» настройки скрипт отрубался, когда память уходила за 128мб.

Установил в самом PHP скрипте

ini_set('memory_limit', '8192M');

И теперь проблем нет.

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