Окружение
ОС: 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.
Окружение
ОС: 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() {$PIDFILE ] && kill -0 $ (cat $PIDFILE); then
if [ -f
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.