OTOBO исправление проверки работы Daemon

Материал из m6a
Перейти к: навигация, поиск

Изменения в файле /opt/otobo/Kernel/Output/HTML/Notification/DaemonCheck.pm Следующие изменения были внесены в файл /opt/otobo/Kernel/Output/HTML/Notification/DaemonCheck.pm для проверки реального статуса демона OTOBO вместо использования кеша DaemonRunning.

Исходный код (использовал кеш DaemonRunning)

 perlCopy code1# ...
 2
 3package Kernel::Output::HTML::Notification::DaemonCheck;
 4
 5use parent 'Kernel::Output::HTML::Base';
 6
 7use strict;
 8use warnings;
 9
 10use Kernel::System::VariableCheck qw(:all);
 11
 12our @ObjectDependencies = (
 13    'Kernel::Config',
 14    'Kernel::Output::HTML::Layout',
 15    'Kernel::System::Cache',
 16    'Kernel::System::Group',
 17);
 18
 19sub Run {
 20    my ( $Self, %Param ) = @_;
 21
 22    # get config object
 23    my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
 24
 25    # get the NodeID from the SysConfig settings, this is used on High Availability systems.
 26    my $NodeID = $ConfigObject->Get('NodeID') || 1;
 27
 28    # get running daemon cache
 29    my $Running = $Kernel::OM->Get('Kernel::System::Cache')->Get(
 30        Type => 'DaemonRunning',
 31        Key  => $NodeID,
 32    );
 33
 34    return  if $Running;
 35
 36    # get layout object
 37    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
 38
 39    my %NotificationDetails = (
 40        Priority => 'Error',
 41        Data     => $LayoutObject->{LanguageObject}->Translate("OTOBO Daemon is not running."),
 42    );
 43
 44    # ... (остальная часть кода)
 45}
 46
 471;
 48

Измененный код (использует PID-файл для проверки)

 perlCopy code1# --
 2# OTOBO is a web-based ticketing system for service organisations.
 3# --
 4# Copyright (C) 2001-2020 OTRS AG, https://otrs.com/
 5# Copyright (C) 2019-2024 Rother OSS GmbH, https://otobo.io/
 6# --
 7# This program is free software: you can redistribute it and/or modify it under
 8# the terms of the GNU General Public License as published by the Free Software
 9# Foundation, either version 3 of the License, or (at your option) any later version.
 10# This program is distributed in the hope that it will be useful, but WITHOUT
 11# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 12# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 13# You should have received a copy of the GNU General Public License
 14# along with this program. If not, see <https://www.gnu.org/licenses/>.
 15# --
 16
 17package Kernel::Output::HTML::Notification::DaemonCheck;
 18
 19use parent 'Kernel::Output::HTML::Base';
 20
 21use strict;
 22use warnings;
 23
 24use Kernel::System::VariableCheck qw(:all);
 25use File::Exists qw( -e );  # Добавляем модуль для проверки существования файла
 26
 27our @ObjectDependencies = (
 28    'Kernel::Config',
 29    'Kernel::Output::HTML::Layout',
 30    'Kernel::System::Cache',
 31    'Kernel::System::Group',
 32);
 33
 34sub Run {
 35    my ( $Self, %Param ) = @_;
 36
 37    # get config object
 38    my $ConfigObject = $Kernel::OM->Get('Kernel::Config');
 39
 40    # get layout object
 41    my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
 42
 43    # Get the PID file path from the configuration
 44    my $PIDFile = $ConfigObject->Get('Daemon::PID::Path');
 45
 46    # Check if the PID file exists
 47    if ( -e $PIDFile ) {
 48        # Read the PID from the file
 49        my $PID = `cat $PIDFile 2>/dev/null`;
 50        chomp($PID);
 51
 52        # Check if the process is running
 53        if ( $PID && kill 0, $PID ) {
 54            # Daemon is running
 55            return ;  # Don't show any notification
 56        }
 57    }
 58
 59    # Daemon is not running or PID file does not exist
 60    my %NotificationDetails = (
 61        Priority => 'Error',
 62        Data     => $LayoutObject->{LanguageObject}->Translate("OTOBO Daemon is not running."),
 63    );
 64
 65    # ... (остальная часть кода)
 66}
 67
 681;
 69

Подробное описание изменений

Добавлен модуль File::Exists: use File::Exists qw( -e ); Этот модуль предоставляет функцию -e, которая позволяет проверить, существует ли файл.


Изменена логика проверки статуса демона в методе Run: Вместо использования кеша DaemonRunning, код теперь выполняет следующие действия: Получает путь к PID-файлу из конфигурации: my $PIDFile = $ConfigObject->Get('Daemon::PID::Path'); Эта строка получает значение переменной Daemon::PID::Path из конфигурации OTOBO. Эта переменная должна содержать полный путь к PID-файлу демона. Проверяет, существует ли PID-файл: if ( -e $PIDFile ) { # ... } Эта строка проверяет, существует ли файл, указанный в $PIDFile. Если файл не существует, это означает, что демон, скорее всего, не запущен. Читает PID из файла: my $PID = cat $PIDFile 2>/dev/null`; chomp($PID);** Если PID-файл существует, эта строка читает содержимое файла (PID процесса) и удаляет символ новой строки (chomp). 2>/dev/nullперенаправляет ошибки (если командаcatне может прочитать файл) в/dev/null, чтобы они не отображались в логах. **Проверяет, запущен ли процесс с указанным PID:** **if ( PID && kill 0, PID ) { # ... }** Эта строка проверяет, запущен ли процесс с PID, который был прочитан из файла. kill 0, $PIDне отправляет сигнал процессу, а только проверяет, существует ли процесс с указанным PID. Если процесс существует, это означает, что демон запущен, и функцияRun возвращает пустую строку, чтобы не отображать уведомление об ошибке. **Отображает уведомление, если демон не запущен:** Если PID-файл не существует или процесс с указанным PID не запущен, код переходит к созданию и отображению уведомления об ошибке: **my %NotificationDetails = ( # ... );`


Краткое описание изменений

Основное изменение заключается в том, что вместо проверки кеша DaemonRunning код теперь проверяет реальное состояние демона, анализируя PID-файл и проверяя, запущен ли процесс с указанным PID. Это обеспечивает более точное и надежное определение статуса демона.