40 lines
No EOL
1.8 KiB
Bash
Executable file
40 lines
No EOL
1.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
# Отложенный рестарт main-симбиот-харнеса (typing-активация, e-261002202857).
|
||
# Рестарт убивает работающих LLM-воркеров (KillMode=cgroup), поэтому:
|
||
# ждём окно -- 15 подряд секунд без живых/зомби-воркеров _llm_worker
|
||
# и без свежих (< 15с) result-файлов тиков /tmp/simbiot_tick_*.json
|
||
# (свежий файл = только что завершившийся тик, у него хвост-постоб<D0BE>отка).
|
||
# Окна нет за дедлайн — выходим БЕЗ рестарта (тик жив, повтор через час).
|
||
set -u
|
||
DEADLINE=$(( $(date +%s) + 150 ))
|
||
is_quiet() {
|
||
NOW=$(date +%s)
|
||
for p in $(pgrep -f 'harness/_llm_worker.py' 2>/dev/null); do
|
||
[ -r "/proc/$p/stat" ] || continue
|
||
st=$(awk '{print $3}' "/proc/$p/stat" 2>/dev/null)
|
||
[ "$st" = "Z" ] && return 1 # живой или зомби-воркер = тик активен
|
||
done
|
||
for f in /tmp/simbiot_tick_*.json; do
|
||
[ -f "$f" ] || continue
|
||
mt=$(stat -c %Y "$f" 2>/dev/null || echo 0)
|
||
[ $((NOW - mt)) -lt 15 ] && return 1 # хвост-постоботка только что завершившегося тика
|
||
done
|
||
return 0
|
||
}
|
||
CLEAN=0
|
||
while [ "$(date +%s)" -lt "$DEADLINE" ]; do
|
||
if is_quiet; then
|
||
CLEAN=$((CLEAN + 1))
|
||
if [ "$CLEAN" -ge 5 ]; then
|
||
echo "окно найдено ($(date '+%H:%M:%S')) — рестарт simbiot-harness"
|
||
systemctl restart simbiot-harness.service
|
||
exit 0
|
||
fi
|
||
sleep 3
|
||
else
|
||
CLEAN=0
|
||
sleep 10
|
||
fi
|
||
done
|
||
echo "окно не найдено за дедлайн — рестарт прерван (тик работает, повтор через час)"
|
||
exit 0 |