Рейтинг:0

Служба отчетов Systemctl вышла из строя после того, как пользователь вручную перезапустил Apache. Можно ли синхронизировать systemd и реальность без перезапуска процессов?

флаг ir

У меня есть экземпляр Apache, который начинается с модуля systemd. Пользователь вручную остановил и перезапустил экземпляр. Теперь systemctl сообщает о сбое службы. Помимо остановки и перезапуска Apache, есть ли способ заставить systemd распознать, что служба запущена?

Это статус. (Я пытался скрыть информацию о компании, так что если httpd-apache и ИНТ-1 не имеет смысла, это потому, что я удалил часть строки символов.)

$ статус systemctl httpd-apache-int-1.service
* httpd-apache.service — HTTP-сервер Apache для экземпляра INT-1.
   Загружено: загружено (/usr/lib/systemd/system/httpd-apache-int-1.service; включено; предустановка поставщика: отключена)
   Активно: сбой (результат: код выхода) со среды 04.05.2022 15:56:39 CDT; 2 дня спустя
     Документы: человек:httpd(8)
           мужчина: апачектл (8)
 Основной PID: 26914 (код=выход, статус=0/УСПЕХ)

Это мой модульный файл.

$ systemctl кошка httpd-apache-int-1.service
# /usr/lib/systemd/system/httpd-apache-int-1.service
[Ед. изм]
Description=HTTP-сервер Apache для экземпляра INT-1
After=network.target remote-fs.target nss-lookup.target
Документация=man:httpd(8)
Документация=человек:apachectl(8)

[Оказание услуг]
Тип = разветвление
# ExecStart не является "системным способом" работы.
# Могут быть проблемы с такими вещами, как бег больше
# больше одного "systemctl ACTION httpd-apache-int-1"
#   вовремя. Но используя Environment (File) и
# переопределение systemd просто не делает то, что я хочу.
ExecStart=/bin/sh -c '\
   источник /etc/sysconfig/httpd.int-1 ; \
   источник /opt/ca/webagent/ca_wa_env.sh ; \
   источник /opt/apache/etc/int-1/WebAgent.conf ; \
   /usr/sbin/httpd $ОПЦИИ ; \
   выход 0'
ExecReload=/bin/kill -USR1 ${MAINPID}
ExecStop=/bin/kill -WINCH ${MAINPID}
# Мы хотим, чтобы systemd дал httpd некоторое время для корректного завершения, но все же хотим
# убить httpd после TimeoutStopSec, если что-то пошло не так во время
# изящная остановка. Обычно Systemd отправляет сигнал SIGTERM сразу после
# ExecStop, который уничтожит httpd. Мы посылаем бесполезный SIGCONT сюда, чтобы дать
# httpd пора заканчивать.
KillSignal=SIGCONT
PrivateTmp=истина

[Установить]
WantedBy=многопользовательская.цель

Это запущенные процессы.

$пс-эф | grep [i] nt-1
апач 1030 27237 0 14:30 ? 00:00:01 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
апач 3291 27237 0 мая 05 ? 00:00:12 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
апач 9974 27237 0 май 05 ? 00:00:15 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
корень 27237 1 0 May04 ? 00:00:05 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
апач 27239 1 0 май 04 ? 00:07:00 LLAWP /opt/apache/etc/int-1/WebAgent.conf-APACHE24
апач 27261 27237 0 май 04 ? 00:00:41 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf
апач 27262 27237 0 май 04 ? 00:00:37 /usr/sbin/httpd -k start -f /opt/apache/etc/int-1/httpd.conf

Другая информация, которая может быть полезна.

Апачи
Версия сервера: Apache/2.4.6 (Red Hat Enterprise Linux)

Операционные системы
Red Hat Enterprise Linux Server, выпуск 7.9 (Maipo)

$ systemctl --версия
системд 219
user10489 avatar
флаг nc
короткий ответ: нет, но вы также можете игнорировать это. Но почему бы не перезапустить его?
Marco avatar
флаг in
Может быть, использовать pidfile, который отслеживает systemd?
Marco avatar
флаг in
Может ли быть так, что из-за сложного запуска сервера apache systemd каким-то образом не может найти правильный pid основного процесса apache (например, использует pid «/ bin / sh»)?
iAmJeff avatar
флаг ir
@ user10489 Производственная система. Перезапуски должны быть одобрены заинтересованными сторонами. Относительно «Короткий ответ: Нет», черт возьми. Я надеялся, что будет какой-то системный трюк.
iAmJeff avatar
флаг ir
@Marco PID-файл определен в httpd.conf, поэтому он «должен» быть тем же самым. Я помню, что видел, что PID фактически соответствовал процессу man при выполнении "ps -ef | grep [a]pache"
Marco avatar
флаг in
@iAmJeff systemd имеет собственную обработку pid. Он следит за запускаемыми процессами и пытается найти pid. Это совершенно не зависит от того, что написано в любом конфигурационном файле httpd.Сравните pid из `systemctl status httpd-apache-int-1` с pid файла httpd.
iAmJeff avatar
флаг ir
@ Марко Ты прав! Глядя на данные в моем вопросе, 26914 из вывода состояния не соответствует 27237, указанному ps. Нет ли простого способа синхронизировать это? (У меня нет желания редактировать пространство памяти запущенных процессов.)
Marco avatar
флаг in
Вы используете systemd так, как это не работает. Похоже, вы все еще застряли в мышлении `init.d`. Лучше всего написать для этого скрипт `init.d`, а остальное пусть systemd сгенерирует.
iAmJeff avatar
флаг ir
@Marco «... пусть systemd сгенерирует остальное». У вас есть ссылка или две с инструкциями по этому поводу?
iAmJeff avatar
флаг ir
@Marco Что касается одного из ваших предыдущих сообщений, можете ли вы поделиться именами или расположением pid-файлов, которые отслеживает systemd?
Marco avatar
флаг in
Я не разработчик systemd, внутренних деталей не знаю. Systemd не отслеживает pid-файлы, если вы не используете опцию `PIDFile=`. Для каждого скрипта `init.d` systemd внутри генерирует псевдослужбу, которую вы можете обрабатывать с помощью `systemctl` так же, как и собственные службы systemd (см. `man systemd-sysv-generator`). Если вы создаете сложные сервисы systemd, вам нужно изучить руководства по systemd (https://www.freedesktop.org/software/systemd/man/). Я могу создать ответ, который точно решит вашу проблему, но лучше выучите его для будущих проблем.
Marco avatar
флаг in
В лучшем случае вам нужно изменить одну строку: поставьте `exec` перед `/usr/bin/httpd`

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.