From 5935ece4ece1cd6458132736f67e90c0bcc3f9c7 Mon Sep 17 00:00:00 2001 From: Simbiot Harness Date: Wed, 30 Sep 2026 02:32:15 +0000 Subject: [PATCH] =?UTF-8?q?ops:=20scripts/safe-restart.sh=20=E2=80=94=20?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D1=82=D0=B0=D1=80=D1=82=20=D0=B4=D0=B5=D0=BC?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=20=D0=BB=D0=B5=D1=81=D1=82=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=8B=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B8=D1=85=D0=BE=D0=B5=20=D0=BE=D0=BA=D0=BD=D0=BE=20(=D0=B1?= =?UTF-8?q?=D0=B5=D0=B7=20=D1=83=D0=B1=D0=B8=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= =?UTF-8?q?=20=D0=B6=D0=B8=D0=B2=D1=8B=D1=85=20LLM-=D0=B2=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D0=B5=D1=80=D0=BE=D0=B2;=20=D0=B7=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=B8=D0=BD=D1=86=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=20=D0=B8=D0=B7=20e-260929234911)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/safe-restart.sh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 scripts/safe-restart.sh diff --git a/scripts/safe-restart.sh b/scripts/safe-restart.sh new file mode 100755 index 0000000..1dc16d8 --- /dev/null +++ b/scripts/safe-restart.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# t-260929210755 / закрытие эскалации e-260929234911: рестарт демона лестницы +# БЕЗ убийства живых LLM-воркеров (рестарт при живом воркере = застрявшая +# running-задача, тот самый инцидент). Ждём «тихого окна» — нет процессов +# harness/_llm_worker.py, с подтверждением 3с, потом systemctl restart. +# +# Гарантия на гонку «проверил → стартовал новый воркер → рестарт»: orphan-requeue +# (commit 42743f9) возвращает running-задачи с мёртвым воркером в очередь — +# даже худший случай не теряет работу, просто повторит её. +# +# Использование: scripts/safe-restart.sh [max_wait_sec] (по умолчанию 3600) +set -u +MAX_WAIT="${1:-3600}" +LOG="${SIMBIOT_RESTART_LOG:-/tmp/simbiot-safe-restart.log}" +SERVICE="${SIMBIOT_SERVICE:-simbiot-harness}" +# якорь в конец cmdline: не матчит sh -c команды, которые лишь УПОМИНАют воркера +PAT='/harness/_llm_worker\.py$' +deadline=$(( $(date +%s) + MAX_WAIT )) +echo "[$(date -u '+%F %T')] safe-restart: ждём тихое окно (макс ${MAX_WAIT}s), сервис ${SERVICE}" >> "$LOG" +while :; do + if ! pgrep -f "$PAT" > /dev/null; then + sleep 3 # окно должно быть устойчивым + if ! pgrep -f "$PAT" > /dev/null; then + echo "[$(date -u '+%F %T')] safe-restart: тихое окно поймано" >> "$LOG" + break + fi + fi + if [ "$(date +%s)" -ge "$deadline" ]; then + echo "[$(date -u '+%F %T')] safe-restart: тихого окна нет ${MAX_WAIT}s — рестарт всё равно (orphan-requeue подхватит)" >> "$LOG" + break + fi + sleep 5 +done +if systemctl restart "$SERVICE"; then + echo "[$(date -u '+%F %T')] safe-restart: демон ${SERVICE} перезапущен" >> "$LOG" +else + echo "[$(date -u '+%F %T')] safe-restart: FAIL — systemctl restart ${SERVICE}" >> "$LOG" + exit 1 +fi \ No newline at end of file