Skip to content

Mamonsu process is killed after startup on Astra Linux due to SysV init script using su ... & #234

Description

@kroxiksut

Окружение
ОС: Astra Linux
Mamonsu: пакетная установка
Python: 3.7
Init-система: systemd
Сервис Mamonsu предоставляется через /etc/init.d/mamonsu
Описание проблемы
При выполнении:

systemctl start mamonsu
systemd сообщает об успешном запуске сервиса:

Starting service OK
Started LSB: Start mamonsu daemon.
Однако фактически процесс Mamonsu почти сразу завершается.

В результате порт 10052 не слушается:

ss -lntp | grep 10052
ничего не возвращает.

Команда:

mamonsu agent metric-list
завершается ошибкой:

Open url: http://0.0.0.0:10052/list, error: [Errno 111] Connection refused
При этом подключение Mamonsu к PostgreSQL работает корректно. Пользователь mamonsu успешно подключается к базе данных с указанными в конфигурации параметрами.

Например, ручное подключение:

psql -h 127.0.0.1 -p 5432 -U mamonsu -d mamonsu
выполняется успешно.

Используемый init-скрипт
В установленном /etc/init.d/mamonsu запуск выполняется следующим образом:

CONFIG=/etc/mamonsu/agent.conf
PIDDIR=/var/run/mamonsu
PIDFILE=$PIDDIR/mamonsu.pid
LOGFILE=/var/log/mamonsu/agent.log

COMMAND="/usr/bin/$NAME -d -a /etc/mamonsu/plugins -c $CONFIG -p $PIDFILE"
RUNAS=mamonsu

[ ! -d $PIDDIR ] && mkdir -p $PIDDIR
chown -R $RUNAS $PIDDIR

start() {
if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE); then
echo 'Service already running' >&2
return 0
fi

echo -n 'Starting service' >&2
su -c "$COMMAND" $RUNAS -s /bin/sh &
echo -e '\t\tOK' >&2
}
Предположительно проблемной является строка:

su -c "$COMMAND" $RUNAS -s /bin/sh &
При этом сам Mamonsu уже запускается с параметром -d, то есть дополнительно демонизируется.

Журнал systemd
После запуска видно следующую последовательность:

su: session opened for user mamonsu
su: session closed for user mamonsu
systemd: session-c2.scope: Killing process XXXXX (mamonsu) with signal SIGTERM
То есть после завершения su systemd закрывает пользовательскую session scope и отправляет SIGTERM процессу Mamonsu.

При этом init-скрипт уже успевает вернуть успешный результат запуска, поэтому:

systemctl status mamonsu
может показывать успешный запуск LSB-сервиса, хотя реального процесса Mamonsu уже нет.

При последующем restart также видно, что PID из PID-файла уже не существует:

/etc/init.d/mamonsu: line 43: kill: (...) - No such process
Service not running
Ожидаемое поведение
После выполнения:

systemctl start mamonsu
процесс Mamonsu должен оставаться запущенным, а локальный HTTP endpoint должен быть доступен на порту 10052.

Команда:

mamonsu agent metric-list
должна успешно получать список метрик.

Возможное решение
На systemd-системах проблема устраняется использованием native systemd unit без запуска через su и без daemon mode.

Например:

[Unit]
Description=Mamonsu monitoring agent
After=network.target postgresql.service

[Service]
Type=simple
User=mamonsu
Group=mamonsu
ExecStart=/usr/bin/mamonsu -a /etc/mamonsu/plugins -c /etc/mamonsu/agent.conf
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
В таком варианте Mamonsu остаётся foreground-процессом, а его жизненным циклом управляет непосредственно systemd.

Также, возможно, проблему можно решить изменением SysV init-скрипта, исключив сочетание:

su ... &
и запуска Mamonsu с параметром:

-d
Итог
Похоже, проблема связана не с подключением к PostgreSQL, а с механизмом запуска Mamonsu через SysV init-скрипт на Astra Linux/systemd.

Будет полезно понять, является ли такой init-скрипт актуальным рекомендуемым способом запуска Mamonsu на systemd-системах, или для них стоит поставлять native systemd unit.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions