|
UniSet 2.44.4
|
Менеджер жизненного цикла процессов для распределённых систем UniSet2. Управляет последовательностью запуска, мониторингом состояния и автоматическим перезапуском.
skip="1")Неизвестные launcher'у аргументы автоматически пробрасываются в дочерние процессы:
Также можно явно указать аргументы для проброса через --:
| Опция | Описание |
|---|---|
--confile FILE | Конфигурационный файл (обязательно) |
--localNode NAME | Имя локального узла (по умолчанию: из атрибута localNode в конфиге) |
--launcher-name NAME | Имя секции Launcher в конфиге |
--http-port PORT | Порт HTTP API (0 = отключено) |
--http-host HOST | Хост HTTP API (по умолчанию: 0.0.0.0) |
--http-whitelist IPs | Whitelist IP/подсетей через запятую |
--http-blacklist IPs | Blacklist IP/подсетей через запятую |
--read-token TOKEN | Bearer-токен для доступа к чтению (UI, GET API) |
--control-token TOKEN | Bearer-токен для управления (POST restart/stop/start) |
--html-template FILE | Пользовательский HTML-шаблон |
--health-interval MS | Интервал проверки состояния в мс (по умолчанию: 5000) |
--stop-timeout MS | Таймаут graceful shutdown в мс (по умолчанию: 5000) |
--uniset-port PORT | UniSet/CORBA порт (default: auto=UID+52809) |
--omni-logdir DIR | Каталог логов omniNames (по умолчанию: $TMPDIR/omniORB) |
--default-ready-check TYPE | Проверка готовности по умолчанию (none, tcp:PORT, и т.д.) |
--disable-admin-create | Не вызывать uniset2-admin –create после запуска omniNames |
--no-monitor | Не мониторить процессы после запуска |
--runlist, --dry-run | Показать что будет запущено без реального запуска |
--verbose | Подробный вывод |
Добавьте секцию <Launcher> в ваш configure.xml.
С использованием шаблонов процессов можно использовать минимальную конфигурацию:
Launcher автоматически:
uniset2-smemory, uniset2-unetexchange и т.д.)--smemory-id, --unet-name и т.д.)corba:ProcessName)--smemory-id для процессов, которым нужен SharedMemorytypeДля нестандартных имён укажите тип явно:
Переопределение отдельных атрибутов с сохранением значений из шаблона:
Для полного контроля или пользовательских процессов:
| Атрибут | Описание | По умолчанию |
|---|---|---|
name | Имя секции Launcher | - |
healthCheckInterval | Интервал проверки состояния (мс) | 5000 |
restartDelay | Начальная задержка перед перезапуском (мс) | 1000 |
maxRestartDelay | Максимальная задержка (экспоненциальный backoff) (мс) | 30000 |
restartWindow | Временное окно для подсчёта перезапусков (мс) | 60000 |
maxRestarts | Максимальное количество перезапусков (0 = бесконечно) | 0 |
httpPort | Порт HTTP API (0 = отключено) | 0 |
commonArgs | Общие аргументы, добавляемые ко всем процессам | "" |
defaultReadyCheck | Проверка готовности по умолчанию для процессов без явной | none |
Используйте commonArgs чтобы не повторять общие аргументы как --confile и --localNode:
Результирующая командная строка для UNetExchange:
| Атрибут | Описание | По умолчанию |
|---|---|---|
name | Имя процесса (обязательно) | - |
type | Тип процесса для поиска шаблона | авто-определение |
command | Путь к исполняемому файлу | из шаблона |
args | Аргументы командной строки | из шаблона |
rawArgs | Отдельные аргументы без commonArgs | "" |
workDir | Рабочий каталог | текущий |
readyCheck | Проверка готовности (см. ниже) | из шаблона |
readyTimeout | Таймаут проверки готовности (мс) | 10000 |
checkPause | Пауза между проверками готовности (мс) | 500 |
healthCheck | Проверка работоспособности (watchdog) | нет |
healthFailThreshold | Количество неудачных liveness проверок до рестарта | 3 |
ignoreFail | Игнорировать сбой процесса (не останавливать launcher после исчерпания попыток) | false |
maxRestarts | Попытки перезапуска: -1 = не рестартовать, 0 = бесконечно, >0 = ограничено | 0 |
restartDelay | Начальная задержка перед перезапуском (мс) | 1000 |
maxRestartDelay | Максимальная задержка (экспоненциальный backoff) (мс) | 30000 |
nodeFilter | Запуск на определённых узлах | все |
skip | Пропустить этот процесс (не запускать) | false |
manual | Запуск только вручную через REST API | false |
oneshot | Процесс запускается один раз и завершается | false |
oneshotTimeout | Таймаут для oneshot процесса (мс) | 30000 |
afterRun | Shell-команда для запуска после старта процесса | "" |
Атрибут nodeFilter позволяет указать, на каких узлах должен запускаться процесс:
Правила:
Node1 ≠ node1)--localNodeПри запуске uniset2-launcher --localNode Node1:
nodeFilter="Node1,Node2" → процесс запуститсяnodeFilter="Node3" → процесс не запуститсяnodeFilter="" (пусто) → процесс запуститсяВ режиме --runlist пропущенные по фильтру процессы отображаются в секции "Skipped".
Используйте skip="1" для временного отключения процесса без удаления из конфигурации:
Пропущенные процессы:
allRunning (проверка состояния проходит успешно)"skip": true и "state": "stopped"skip и перезапуском launcher'аЭто полезно для:
Используйте manual="1" для процессов, которые не должны запускаться автоматически, но могут быть запущены через REST API или Web UI:
Процессы с manual="1":
allRunning пока не были запущеныPOST /api/v2/launcher/process/{name}/start"manual": true--runlist отмечаются как (manual)Отличие от skip:
skip="1" — процесс полностью игнорируется, нельзя запустить через APImanual="1" — процесс не запускается автоматически, но можно запустить через APIЭто полезно для:
| Тип | Формат | Пример |
|---|---|---|
| TCP | tcp:host:port или tcp:port | tcp:2809, tcp:localhost:4840 |
| CORBA | corba:ObjectName | corba:SharedMemory |
| HTTP | http:url | http://localhost:8080/health |
| File | file:path | file:/var/run/service.pid |
Для отключения проверки готовности используйте readyCheck="none".
По умолчанию процессы без явного readyCheck и без шаблона не имеют проверки готовности. Можно задать проверку готовности по умолчанию на уровне Launcher:
В конфигурации:
Через командную строку:
Приоритет (от высшего к низшему):
readyCheck атрибут процессаreadyCheck из шаблона процесса (для известных типов)defaultReadyCheck из конфигурации LauncherВ отличие от readyCheck (проверяется при старте), healthCheck проверяет работоспособность процесса во время работы. Если процесс перестал отвечать (зависание, deadlock), watchdog автоматически перезапустит его.
Логика работы:
healthCheckInterval мс (по умолчанию 5000) проверяется healthCheckhealthFailThreshold — процесс перезапускается (SIGTERM → пауза → SIGKILL)Атрибуты:
healthCheck — проверка (формат такой же как readyCheck: tcp:port, http://url, corba:Name, file:path)healthFailThreshold — количество последовательных неудач до рестарта (по умолчанию 3, 0 = отключить)Отличие от обычного мониторинга:
healthCheck проверяет отклик процесса (сеть, файл и т.д.)Это полезно для обнаружения:
По умолчанию все процессы автоматически перезапускаются при падении с экспоненциальным backoff:
Логика перезапуска:
maxRestarts=0 (по умолчанию) — бесконечные перезапускиmaxRestarts=-1 — отключить перезапускmaxRestarts=N (N>0) — ограничить количество попытокignoreFail="true" — после исчерпания попыток не останавливать launcher (процесс остаётся в Failed)Пример последовательности перезапусков (restartDelay=1000, maxRestartDelay=30000):
Конфигурация на уровне Launcher:
На уровне процесса:
При исчерпании попыток:
ignoreFail="true" — процесс остаётся в состоянии FailedСостояния процесса:
running — процесс работаетstopped — процесс остановленfailed — процесс упал (перезапуск отключён или исчерпан)restarting — процесс ожидает перезапуска (отображается мигающим в Web UI)starting — процесс запускаетсяstopping — процесс останавливаетсяcompleted — oneshot-процесс завершился успешноВстроенные шаблоны для автоматической конфигурации:
| Тип | Команда | Паттерн аргументов | Проверка готовности | Префиксы |
|---|---|---|---|---|
SharedMemory | uniset2-smemory | --smemory-id ${name} | corba:${name} | SharedMemory, SM_, SMemory |
UNetExchange | uniset2-unetexchange | --unet-name ${name} | corba:${name} | UNet, UNetExchange |
MBTCPMaster | uniset2-mbtcpmaster | --mbtcp-name ${name} | corba:${name} | MBTCPMaster, MBTCP, ModbusTCP |
MBTCPMultiMaster | uniset2-mbtcpmultimaster | --mbtcp-name ${name} | corba:${name} | MBMultiMaster, MBTCPMulti |
MBSlave | uniset2-mbslave | --mbs-name ${name} | corba:${name} | MBSlave, ModbusSlave |
RTUExchange | uniset2-rtuexchange | --rs-name ${name} | corba:${name} | RTU, RTUExchange |
OPCUAServer | uniset2-opcua-server | --opcua-name ${name} | corba:${name} | OPCUAServer, OPCUASrv |
OPCUAExchange | uniset2-opcua-exchange | --opcua-name ${name} | corba:${name} | OPCUAExchange, OPCUAClient |
MQTTPublisher | uniset2-mqttpublisher | --mqtt-name ${name} | corba:${name} | MQTT, MQTTPublisher |
LogDB | uniset2-logdb | --logdb-name ${name} | нет | LogDB |
IOControl | uniset2-iocontrol | --io-name ${name} | corba:${name} | IOControl, IO_ |
BackendClickHouse | uniset2-backend-clickhouse | --clickhouse-name ${name} | corba:${name} | ClickHouse, BackendClickHouse |
UWebSocketGate | uniset2-uwebsocket-gate | --ws-name ${name} | corba:${name} | WebSocket, UWebSocket |
Примечание: Все процессы являются критическими по умолчанию. Используйте ignoreFail="true" для процессов, падение которых не должно останавливать launcher.
Placeholder ${name} заменяется на имя процесса.
Launcher автоматически определяет, нужен ли Naming Service (omniNames), на основе параметра конфигурации localIOR:
localIOR=0 (по умолчанию): Naming Service нужен — процессы используют CORBA Naming ServicelocalIOR=1: Naming Service не нужен — процессы используют локальные IOR-файлыЭто влияет на вывод режима --runlist.
Используйте --runlist или --dry-run чтобы увидеть что будет запущено без реального запуска процессов:
Пример вывода:
При запуске с --http-port доступен веб-интерфейс для мониторинга и управления процессами.
Откройте в браузере: http://localhost:8080/ или http://localhost:8080/ui
--control-token)Используйте --html-template для указания собственного HTML-шаблона:
Доступные placeholder'ы в шаблоне:
{{NODE_NAME}} — имя текущего узла{{API_URL}} — базовый URL API (например http://localhost:8080){{CONTROL_ENABLED}} — true если задан control-token, иначе falseLauncher поддерживает двухуровневую Bearer-токен авторизацию.
| Опция | Назначение |
|---|---|
--read-token TOKEN | Токен для чтения (Web UI, GET запросы к API) |
--control-token TOKEN | Токен для управления (POST restart/stop/start) |
Открытый доступ (по умолчанию):
Только управление защищено:
Authorization: Bearer secret123Полная авторизация:
Authorization: Bearer viewerAuthorization: Bearer adminКогда указан --http-port, доступны следующие endpoints. Launcher использует HTTP API v2.
Для ограничения доступа к HTTP API используйте whitelist/blacklist:
Поддерживаемые форматы:
192.168.1.0/24, 10.0.0.0/8192.168.1.100172.16.0.10-172.16.0.20Правила:
Получить статус всех процессов.
Синоним для /api/v2/launcher.
Получить список всех процессов с подробной информацией.
Получить статус конкретного процесса.
Веб-интерфейс для управления процессами. См. раздел Web UI.
JavaScript-файл для веб-интерфейса.
Перезапустить процесс. Требует --control-token.
Остановить процесс. Требует --control-token.
Запустить остановленный процесс. Требует --control-token.
Перезапустить все работающие процессы. Требует --control-token.
Перезапускаются только:
running, failed, restartingskip=false)nodeFilter)Если все процессы остановлены (например, после stop-all), запускает все процессы кроме skip, manual, oneshot.
Если restart-all уже выполняется, повторный вызов возвращает OK:
Если выполняется другая операция (reload-all, stop-all), возвращается ошибка:
Полная перезагрузка: остановить все процессы, затем запустить заново. Требует --control-token.
В отличие от restart-all, который перезапускает только работающие процессы по отдельности, reload-all выполняет полный цикл: остановка всех → сброс состояния → запуск всех в порядке зависимостей.
Поведение:
skip=true — пропускаютсяmanual=true — пропускаютсяoneshot — запускаются зановоЕсли reload-all уже выполняется, повторный вызов возвращает OK:
Если выполняется другая операция (restart-all, stop-all), возвращается ошибка:
Остановить все процессы. Требует --control-token.
Особенности:
restart-all или reload-all — фаза запуска процессов будет остановленаrestart-all или reload-allЕсли stop-all уже выполняется, повторный вызов возвращает OK:
Проверка состояния для Docker/Kubernetes.
Возвращает HTTP 200 если здоров, 503 если нет.
Получить группы процессов.
Получить справку по доступным командам API.
По умолчанию (если не указан --localIOR), Launcher автоматически:
uniset2-admin --createДля UID=1000 → порт 53809 Для UID=1001 → порт 53810
Это позволяет нескольким пользователям на одном сервере запускать проекты без конфликтов.
По умолчанию: $TMPDIR/omniORB или $HOME/tmp/omniORB
Можно переопределить: --omni-logdir /path/to/logs
Следующие переменные устанавливаются автоматически и могут использоваться в аргументах процессов:
${CONFFILE} — Путь к файлу конфигурации${NODE_NAME} — Имя локального узлаДополнительные переменные можно определить в секции <Environment>.
При остановке (Ctrl+C, SIGTERM, REST API stop) Launcher корректно завершает все процессы.
При остановке процесса Launcher завершает всё дерево процессов — родительский процесс и все его дочерние процессы (внуки, правнуки и т.д.). Это гарантирует, что не останется "зомби"-процессов или "осиротевших" дочерних процессов.
Алгоритм:
SIGTERM всем процессам в дереве (от листьев к корню)--stop-timeout миллисекундSIGKILL всем оставшимсяПример: Если запущен bash-скрипт, который порождает несколько подпроцессов:
При остановке bash_script.sh будут завершены также subprocess1, subprocess2, subprocess3.
Параметр --stop-timeout (по умолчанию: 5000 мс) определяет время ожидания graceful shutdown перед принудительным завершением:
Для процессов с длительной процедурой завершения (flush буферов, закрытие соединений) рекомендуется увеличить таймаут.
При завершении Launcher'а:
При установке пакета в $(datadir)/uniset2/ размещается шаблон uniset2-launcher.service.template. Скопируйте его и настройте:
Пример unit-файла:
Для нескольких нод можно использовать шаблон с i:
Установка: systemctl enable uniset2-launcher@Node1
Launcher собирается как часть расширений UniSet2:
Устанавливаются следующие файлы:
/usr/bin/uniset2-launcher — Основной исполняемый файл/usr/share/uniset2/launcher.html — HTML-шаблон Web UI/usr/share/uniset2/launcher-app.js — JavaScript Web UI