Вопрос или проблема
- Мои окружения:
- ОС: Ubuntu 22.04 LTS
- Пользовательское приложение: (веб-приложение, написанное на PHP + графический интерфейс electron, работающий в режиме киоска):
- Веб-сервер: xampp (php 7.4)
Чтобы веб-приложение могло беспрепятственно взаимодействовать с онлайн-сервером, следующий скрипт оболочки (запускаемый в бесконечном цикле) выполняется с помощью cron (@reboot) каждый раз при запуске или перезагрузке ОС:
while [ 1 -eq 1 ]; do
# Запрос к серверу Google
$WGET -q --tries=10 --timeout=4 $GOOGLEURL -O /tmp/index.site &> /dev/null
# Нет соединения с интернетом
if [ ! -s /tmp/index.site ];then
echo $noConnectionMessage;
wget -q --tries=10 --timeout=4 "http://localhost/POSAPP/web/app.php/***" -O /tmp/index.site &> /dev/null
sleep $delay;
# Вернуть истину, если есть соединение с интернетом
else
$WGET -q --tries=10 --timeout=4 "http://localhost/POSAPP/web/app.php/****" -O /tmp/index.site &> /dev/null
$WGET -q --tries=10 --timeout=4 "http://localhost/POSAPP/web/app.php/****" -O /tmp/index.site &> /dev/null
#notify-send --icon="/opt/lampp/htdocs/***.png" "$connectionMessage" --urgency="low"
echo $connectionMessage;
fi
sleep $delay;
done
Обратите внимание, что url (http://localhost/POSAPP/web/app.php/***) не нацелен на онлайн-сервер, а вместо этого нацеливается на локальную веб-службу, и эта веб-служба теперь вызовет онлайн веб-сервер внутренне (используя библиотеку guzzle php). Этот процесс необходим для синхронизации системы с правильной сессией и другими требованиями.
Проблемы: иногда вся ОС зависает. Я искал в syslog.x, но не смог найти какую-либо релевантную информацию, связанную с cron, но когда я проверил каталог /var/crash/, я нашел следующие файлы:
- _usr_bin_wget.0.crash
- _usr_lib_myapp_MyApp.1000.crash
зная, что “MyApp” является пользовательским веб-браузером. Что очень привлекло мое внимание, это содержимое _user_bin_wget.0.crash (дата и время совпадают с временами сбоя), которое выглядит следующим образом:
ProblemType: Crash
Architecture: amd64
Date: Wed Feb 5 12:34:01 2025
DistroRelease: Ubuntu 22.04
ExecutablePath: /usr/bin/wget
ExecutableTimestamp: 1643025540
ProcCmdline: /usr/bin/wget -q --tries=10 --timeout=4 http://localhost/MyWebApp/app.php/**** -O /tmp/index.site
ProcCwd: /root
ProcEnviron:
PATH=(custom, no user)
LANG=en_US.UTF-8
SHELL=/bin/sh
ProcMaps:
556a557ec000-556a557f7000 r--p 00000000 08:05 2098442 /usr/bin/wget
556a557f7000-556a55848000 r-xp 0000b000 08:05 2098442 /usr/bin/wget
556a55848000-556a55865000 r--p 0005c000 08:05 2098442 /usr/bin/wget
Мое внимание больше сосредоточено на строке 7:
ProcCmdline: /usr/bin/wget -q --tries=10 --timeout=4 http://localhost/MyWebApp/app.php/**** -O /tmp/index.site
Перегружает ли это память (–tries=10 –timeout=4)? Или аварийное завершение вообще не связано с этой веб-запросом? Помните, что цель этого запроса – держать локальное (оффлайн) веб-приложение синхронизированным с сервером всякий раз, когда есть соединение с интернетом.
Буду очень признателен любому, кто предоставит релевантные рекомендации.
Ответ или решение
Проблема, которую вы описали, связана с периодическими зависаниями операционной системы Ubuntu 22.04 LTS. Эти зависания, как вы указали, возникают в результате бесконечно повторяющихся запросов, осуществляемых с помощью утилиты wget
. Давайте рассмотрим, почему это может происходить, и как можно исправить ситуацию.
Теория
Программа wget
используется для захвата данных с веб-сайтов. В вашем случае она постоянно обращается к локальному веб-серверу и удаленному серверу для определения наличия или отсутствия интернет-соединения. Эта программа инициируется через команду cron, настроенную так, чтобы запускаться при каждом перезапуске системы. Сценарий предполагает бесконечный цикл, в котором wget
делает запросы как к Google, так и к локальному серверу XAMPP.
Постоянное потребление системных ресурсов может привести к нескольким проблемам:
-
Чрезмерное использование CPU и памяти: Даже небольшие процессы, выполняющиеся бесконечно, могут накапливать значительное использование ресурсов, особенно при частых и быстрых запросах.
-
Заполнение файловой системы: Постоянная запись в файлы может привести к полному заполнению доступного дискового пространства, особенно если файлы никогда не чистятся или не удаляются.
-
Конфликты с другими процессами: Ваша установка использует XAMPP, которая также может потреблять ресурсы. Любые конфликты могут привести к остановкам одного или обоих процессов.
Пример
Рассмотрим, как ваш сценарий на практике перегружает систему. Каждый раз wget
пытается загрузить страницу по URL и делает это до 10 попыток (параметр --tries=10
) с тайм-аутом в 4 секунды. Некорректно обработанные ошибки соединения или отсутствия ресурса могут привести к тому, что ваши повторные попытки попросту захлебываются в ожидании. Поскольку нет механизмов логирования результатов или их анализа, ваши попытки просто продолжают выполняться, даже если они неудачны, расходуя при этом все больше ресурсов.
Приложение
Теперь, когда вы понимаете, что происходит, давайте обсудим, какие меры можно предпринять для решения проблемы:
-
Ограничение в цикле: Увеличьте паузу между запросами, используя
sleep
, чтобы снизить нагрузку на процессор и сетевые подключения. Например, попробуйтеsleep
значением в 30-60 секунд. -
Логирование и анализ результатов: Включите логирование результатов и ошибок, чтобы отслеживать, когда и почему происходят сбои. Это поможет не только быстро находить проблему, но и предвидеть повторение таких случаев.
-
Управление ресурсами: Воспользуйтесь инструментами управления ресурсами, такими как
nice
илиionice
, чтобы снизить приоритет выполнения ваших скриптовwget
. -
Востановление после ошибок: Добавьте механизмы обработки неудачных попыток, например, после некоторого количества безуспешных запросов сценарий должен переходить в режим ожидания на более длительное время или даже перезапускать систему.
-
Асинхронные запросы: Возможно, стоит рассмотреть возможность использования фоновых задач или асинхронных методов для выполнения запросов без блокирования основного потока обработки.
-
Тестирование и профилирование: Начните с тестирования текущей нагрузки на сервер и оптимизации кода вашего приложения на PHP и Electron, возможно, оптимизации требуют и они.
Предложенные изменения помогут вам уменьшить вероятность зависаний операционной системы и обеспечить более стабильное и эффективное выполнение ваших фоновых задач.