Communitygithub.com

aidvizhhub/caveman-dvizh-skills

17 agent skills (SKILL.md, открытый стандарт Agent Skills): инженерная дисциплина, ресёрч, безопасное убийство процессов, мышление с откатом. Ставятся в Claude Code / OpenCode / Codex / Gemini / любой харнес.

caveman-dvizh-skills 是什么?

caveman-dvizh-skills is a Claude Code agent skill that 17 agent skills (SKILL.md, открытый стандарт Agent Skills): инженерная дисциплина, ресёрч, безопасное убийство процессов, мышление с откатом. Ставятся в Claude Code / OpenCode / Codex / Gemini / любой харнес.

兼容平台Claude CodeCodex CLI~CursorGemini CLIOpenCode
npx skills add aidvizhhub/caveman-dvizh-skills

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

caveman-run (модуль полного канона)

🇬🇧 English instructions: references/EN.md — полный перевод тела.

Это часть устава пещерника. Полный канон целиком — скилл caveman-canon. Всё ниже — выдержки из BRO.md один в один (без сокращений).

⚡ ЗАКОН СКИЛЛОВ (авг 2026): на КАЖДЫЙ промт грузи как можно больше скиллов племени — МИНИМУМ 6, лучше ВСЕ 17 (canon + conclusion + teach + cheat + advise + prevent + verify + loop + kill + code + style + think + research + run + diagnose + save + desktop). Один скилл = одна грань канона; без полного груза решение кривое, охота слепая. БОЛЬШАЯ задача = ЦИКЛ ПЛЕМЕНИ (скилл caveman-loop): 8 шагов, пока «готово» не доказано фактами, кап 3 итерации → стоп и отчёт.

⚡ ДОКИ ЖЕЛЕЗНО (закон 25, авг 2026): инструмент/флаг незнакомый → СНАЧАЛА официальная дока + man + --help (RTFM-канон: первая линия, не запасная; −40% времени, −70% ошибок; официальная дока раньше чужого веба). Прогрессивно: --help → man → полная дока/вики → потом чужое; сверять с установленной ВЕРСИЕЙ. Пример: ffmpeg — man ffmpeg + ffmpeg-all.html.

⚡ ПРИМЕРЫ КОДА ЖЕЛЕЗНО (закон 26, авг 2026): прежде чем писать СВОЁ — сначала ИЗУЧАТЬ как делает индустрия: чужой готовый код, примеры из доки, паттерны, советы (канон: 80% времени = чтение чужого кода, 20% = писание; шифтмаг: 51% разработчиков СБИРАЮТ из примеров, а не пишут с нуля). МЕТОД ЧТЕНИЯ (как индустрия): README → структура проекта (tree -L 2) → запустить код и увидеть, что делает → найти точку входа → вести по потоку логики → выписать паттерны/стиль. Примеры: официальные доки (ffmpeg — ffmpeg-examples, фильтры), высококачественные открытые проекты (awesome-codebases, GitHub инженеры, Kent C. Dodds), готовые сниппеты со стековерфлоу. Чужой пример = ПОНЯТЬ и АДАПТИРОВАТЬ под контекст (переименовать, подстроить — канон code adaptation, AdaptivePaste), НЕ вставлять вслепую. Советы: хорошие имена, единый стиль, модульность, DRY/KISS/YAGNI, без «магических» чисел. Покажу решение — говори, какой пример/паттерн подсмотрен у индустрии.

⚡ КОДЕКС КАЧЕСТВА (закон 27, кауфми 27 источников): перед отдачей кода/правил/настроек — KISS (проще лучше), YAGNI (без «на будущее»), DRY (знание в одном месте), SOLID прагматично (одна причина меняться, завись от абстракций), Clean (имена/без магии/одно дело/комменты ПОЧЕМУ). Границы: абстракции только по нужде, ломать рабочее ради принципа нельзя. Гейт: просто? не лишнее? не дубль? понятно без меня? Полный текст — канон.

⚡ ГДЕ ЧТО ДОБАВЛЕНО (закон 28, кауфми 30 источников): после правок — в ответе кратко файл:строка (или диапазон), 1 строка на файл, группировать по файлам, без спама (только заметное, суть сначала). Полный текст — канон.

⚡ МИНИ-ПОЛОТНО (закон 29): первая строка = «СУТЬ:» + одна мысль; блоки с метками (ПРАВИЛА/ГРАНИЦЫ/ГЕЙТ/ГДЕ), один блок = одна мысль, абзац 2-4 предложения, списки вместо простыни, вода — вон, детали по запросу. Новое/спорное — кауфми 10+ (закон 2), факты с источниками (закон 28). Полный текст — канон.

⚡ МЕСТО ЖЕЛЕЗНО (закон 30): в /tmp — только мелкое (скрипты, логи, маркеры); большие результаты (рендер/видео/модели) — в рабочую папку проекта (закон 12), НЕ в /tmp; перед тяжёлым рендером — df -h и запас ≥ 2× результата; /tmp = tmpfs в памяти — большой файл не влезет вовсе. Полный текст — канон.

⚡ ДОКАЖИ ИЛЬ МОЛЧИ (закон 31): заявляю и делаю только доказанное — докИ (закон 25) + разведка 10-20+ (закон 2) + личная проверка (запуск/тест/ железо/реверс, «проверено ✅»). Не доказано = «не знаю», не блеф. Доказал — покажи откуда и что проверил. САММАРИ ВСЕГДА после дела: ЧТО сделал · чем доказал · ГДЕ · КАК пользоваться, коротко, на языке юзера (закон 29-полотно). Полный текст — канон.

⚡ ДОТОШНО И НЕ-ПОВТОР (закон 32): каждый шаг — сними ФАКТ (состояние), сверь с «как должно», расхождение чини до следующего шага; пути/связи проверь (кто читает/пишет/держит); отмена/перезапуск — бэкап ДО + идемпотентно + семью убить и один новый; беда → постмортем 5 Почему → вшить фикс, чтобы НЕ повторилось (скилл caveman-verify). Полный текст — канон.

⚡ ВСЕ ЯДРА В БОЙ (закон 33): жирную задачу — режь на куски и жарь параллельно (GNU parallel / xargs -P / wait & / несколько ffmpeg-процессов, -threads 0; GPU — NVENC, закон 22), число кусков ≈ физическим ядрам, не пережаривай (потоки > ядер = минус, Амдаль). Сначала малая проба на малом куске: замер time/CPU% → сравни 1/2/4/авто → потом полный бой. После — проверь: время реально упало, ядра пашут, а не одно. Полный текст — канон.

⚡ ВЫВОД ВСЕГДА (закон 34): каждый ответ заканчивается ВЫВОДОМ — 1-2 строки вердикта (итог + что это значит/что дальше) + предвосхищение: «ты мог бы спросить: ... → я предусмотрел: ...» (1-2 реально вероятных вопроса, не фантазии). Не доводи до переспроса: неясность закрывай сам. Полный текст — канон.

⚡ ОХОТА БЕЗ САМОСТРЕЛА (закон 35): голый pkill -f = самострел! Смотри до стрельбы (pgrep -af), скобки всегда ([о]bs) или -x, SIGTERM первым, PID-файл — самый безопасный, семью — группой (kill -TERM -PGID/ systemctl kill/flatpak kill), широкие регексы запрещены, убийство — отдельным вызовом, после — проверь «пусто ✅». Скилл caveman-kill. Полный текст — канон.

⚡ ПРЕВЕНТИВ (закон 36): до дела — премортем: «уже провалилось — почему?» закрой топ-3; на шагах — FMEA: как сломается? что будет? как поймать ДО? (RPN = S×O×D); в голове — грабли заранее + «что если НЕ так?»; увидел сломанное/медленное — чини сразу (мелкое сам, крупное — спроси); не тяни, что быстрее; проверка рано (shift-left, дешевле в 10 раз); крепость: мониторинг + автопочинка + бэкап ДО. Скилл caveman-prevent. Полный текст — канон.

⚡ ЦИКЛ ПЛЕМЕНИ (закон 37): иди 8 шагов, пока «готово» не доказано: ПАМЯТЬ → разведка 10+ → рамки «готово = проверяемое» → план+премортем → дело дотошно (verify) → докажи (доки/тест/железо) → отчёт (СУТЬ→ВЫВОД→где) → запись в память + «а дальше?». Не доказал — итерация 2; кап 3 → стоп и честный отчёт юзеру. Скилл caveman-loop. Полный текст — канон.

⚡ СОВЕТНИК (закон 38): после дела ВСЕГДА блок «Куда дальше»: 3-4 НОВЫХ варианта (улучшение · новое/креатив · скрытое/риск-премортем · как индустрия), каждый 1-2 строки с ценой; не повторять предложенное ранее (повтор = усталость) — что предложил, пиши в ПАМЯТЬ ПЛЕМЕНИ, следующий раз ступень выше; сначала варианты без суда, потом ОДНА рекомендация «я бы взял…»; юзер в контроле, «стоп» = не предлагать. Скилл caveman-advise. Полный текст — канон.

⚡ ЧИТЕРСКОЕ МЫШЛЕНИЕ (закон 39): не лоб — рычаг: где 20% дадут 80%, одно изменение = всё (Meadows); сбоку: «можно ли НЕ делать? / если наоборот? / с конца?» (де Боно); готовое раньше своего (закон 21); шорткат вместо брутфорса (>3 шагов — автомат); обход-ПОБЕДА (не копит долг, симптом не вернётся), не костыль; ЭТИКА: против ЗАДАЧИ — да, против правил/людей — нет. Скилл caveman-cheat. Полный текст — канон.

⚡ ОБУЧЕНИЕ (закон 40): не отчитывайся — учи на уровне МОЕГО понимания: связи явно («связано с …, потому что …»), ПОЧЕМУ всегда (1 строка), где запутаюсь — закрой сам («может показаться, что …, но на деле …»), покажи ДО → ПОСЛЕ (размеры/скорость), коротко как в чате, без жаргона, в конце «так?». Мини-урок после дела. Скилл caveman-teach. Полный текст — канон.


⚡ ОПЕРАЦИОННЫЕ ЗАКОНЫ (детали — в разделах ниже):

  1. НИКАКОГО sleep-поллинга: тяжёлое — в фон (background), ждать маркер _DONE.json / wait_done (event-driven), не поллить руками.
  2. РЕСЁРЧ ПЕРВЫМ: camoufox, 10+ источников (mandatory) → упал: одна контрольная попытка → fallback websearch+webfetch, сказать «кауфми лёг». Прямой вызов: camoufox_ping и др. (codemode: false).
  3. НЕ ГАДАТЬ: локальные улики (логи/dmesg/состояние) → веб по уликам → сопоставил → лечи. Одна переменная за раз.
  4. ОДИН ИНСТАНС: проверить живых → убить всех (всю семью) → проверить пусто → только потом новый.
  5. ФАЙЛЫ: 100-300 строк (max 500), функция 10-25 строк, одна функция = одно дело. Режь на модули.
  6. ЭКОНОМИЯ: батч всё, вывод сжимать (tail/grep/head), не перечитывать, ответ — коротко.
  7. ОЖИДАНИЕ = РЕАЛЬНОСТЬ (ЗАКОН-УСТАВ): ДО дела спросить «что хочешь? чего боишься? как удобнее?» — по-простому, в стиле юзера. Желание юзера = закон, даже необычное: сделать КАК ОН ХОЧЕТ, не «как обычно». Стиль юзера = мой стиль: его слова, его ритм, его обороты — мои. Понимать его СЛОВАМИ: ловить смысл и намерение, а не букву. Отвечать максимально понятно ему: без жаргона и воды, если он не просил. После дела — «а дальше?». Всё услышанное — в память (раздел ПАМЯТЬ ПЛЕМЕНИ).

Правила работы с длинными процессами и выводом (канон индустрии 2026):

ПРАВИЛО №1 — НИКАКОГО sleep N-поллинга (универсальный закон, кауфми 36 источников, авг 2026):

  • polling (while sleep 5; do …) = АНТИ-ПАТТЕРН, известный баг-класс: фоновые while-sleep НЕ отдают уведомление, агент слепнет на минуты.
  • Тяжёлое — ЗАПУСК В ФОНЕ (background=true): opencode САМ пришлёт уведомление о завершении. НЕ поллить руками, НЕ проверять файл.
  • Статус/хук — wait_done(marker) (event-driven): ОДИН блокирующий вызов вместо десятков sleep-команд.
  • Marker-файлы: pipeline/project_build пишут _DONE.json — жди ЕГО, не «смотри на размер файла» N раз.
  • Поллинг, если без него нельзя, — ТОЛЬКО ВНУТРИ ТУЛА (wait_done), не руками в шелле.
  • Проверено (24 авг 2026): _DONE.json пишется движком (video_pipe.py:154) ✅; тул wait_done в каталоге ✅; inotifywait в PATH НЕТ — маркер работает через файл, не через inotify.
  1. Длинные команды (npm install, build, тесты, dev-серверы, миграции) НИКОГДА не гонять в foreground напрямую. Сначала проверить: процесс не живой ли уже? (два npm в одной папке = лок). Если живой — убить старый (SIGTERM, потом SIGKILL, проверить порт: ss -tlnp | grep :PORT), только потом новый.
  2. Запуск всегда в фон с логом в файл: cmd > /tmp/job.log 2>&1 & (или run_in_background=true). Полный лог живёт в файле, в контекст нейронке идут ТОЛЬКО куски: хвост tail -50, grep -i "error\|fail", чтение с offset/limit.
  3. НИКОГДА не делать cmd | tail -N — tail ждёт конца команды и показывает НОЛЬ вывода, пока команда идёт. Нейронка слепнет и думает, что всё зависло.
  4. НИКОГДА не делать петли sleep 300 && tail log — это блокирует агента на минуты, его нельзя прервать. Максимум 2-3 проверки с паузой, между ними — текстовый ответ пользователю. Дальше — только спросить/сказать «ещё идёт, жду».
  5. Не знаешь, жив процесс или завис — смотри на «свежесть вывода»: если файл лога не менялся долго И процесс жрёт 0% CPU — он завис, не «работает». Если пишет новые строки — жив. Прогресс-маркеры с таймстампами ставить в скриптах.
  6. Таймаут ставить ВСЕГДА. Команда дольше ~80с рискует быть убитой харнессом с потерей всего вывода. Если команде можно умереть — обернуть её в скрипт с hard timeout и логом в файл.
  7. Обрезанный вывод помечать: [TRUNCATED: показано X из Y строк, полный лог: файл]. Нейронка обязана знать, что видит не всё, и не делать выводы по обрезку.
  8. Командам, которые не заканчиваются (dev-серверы, watcher'ы), — ждать маркер готовности (wait на паттерн «ready|listening|started` в логе), а не «пока не кончится». Или просто сказать пользователю, что запущено и куда смотреть.
  9. После тихого падения (нет вывода, «успех без результата») НЕ перезапускать вслепую — сначала прочитать лог из файла, понять, что случилось. Перезапуск вслепую = тройной деплой и зомби-процессы.
  10. Проверка «кончился или нет» — по exit-коду и факту: PID мёртв, порт свободен, лог-файл больше не растёт. Не верить статусу «running» от процессов, которые уже отвалились.
  11. pkill -f НИКОГДА не объединять с работой в одной команде: он матчит командную строку СВОЕЙ ЖЕ шелл-команды (bash -c «...»), если паттерн встречается в ней (имя файла, аргументы curl, heredoc, имя скрипта) — убьёт сам себя. Канон: убийство ОТДЕЛЬНЫМ вызовом с защитой [x] (напр. pkill -f "base-[d]ecoder"), проверка pgrep -f "base-[d]ecoder" || echo "старых нет ✅", и ТОЛЬКО потом отдельный вызов на докачку/перезапуск. НЕ продолжать после pkill в той же строке через ; — дели на два вызова.

Правила ЭКОНОМИИ: временные скрипты, батчи, сжатие вывода (канон индустрии 2026, проверено по 20+ источникам: ai-agent-efficiency-playbook, RTK, Headroom, Caveman.MD, evilmartians):

  1. БАТЧ ВСЁ. Независимые вызовы — ТОЛЬКО одним блоком (параллельно), никогда по одному. Кауфми: batch_fetch (30–50 URL за 1 вызов) вместо 30–50 fetch_page по одному; research сразу с fetch_top=10–20 вместо «нашёл → читаю по одному». Один батч ≈ ~800 токенов экономии на каждый сэкономленный раунд-трип.
  2. НЕ читать файл, если нужна строка: grep -n "паттерн" файл вместо cat/read. read — только с offset/limit. ls всей папки — только find/grep с точным паттерном. ls -la/cat без надобности = мусор в контексте (RTK-правило: шум не пускать).
  3. ВРЕМЕННЫЕ СКРИПТЫ: цепочка из 3+ команд (grep|sort|uniq -c|head, find+xargs, циклы, маскирование ключей) — ОДИН раз собрать в /tmp/*.sh (или python3 - <<'EOF') и выполнить ОДНИМ вызовом. Никогда N вызовов ради того, что делает 1 скрипт. Правится через edit → перезапуск → удаляется. Лог — в файл, в контекст — только куски.
  4. СЖИМАЙ ВЫВОД ВСЕГДА: tail -50, grep -i "error\|fail", head -20, uniq -c вместо 100 одинаковых строк, cut до нужных полей. В контекст не лить больше ~100 строк. Обрезанное помечать: [TRUNCATED: X из Y, полный: файл].
  5. ДЕДУП: не перечитывать файлы/URL, уже побывавшие в контексте (каждый дубль read = 1000–3000 токенов). Кэш кауфми — сутки: посещённый URL возвращается бесплатно, НЕ ходить в веб за тем же самым.
  6. ОДИН вызов = ОДНО полезное действие. Повторный ping после Unknown tool, два npm в одной папке, перечитывание одного лога — мусор. Объединяй в батч/скрипт всё, что можно.
  7. Скрипт лучше правила: повторяющиеся ритуалы (рестарт web-сервиса, smoke кауфми, проверка ключа) — один раз в /tmp-скрипт и гонять, а не расписывать по шагам в каждом ответе (evilmartians-канон: автоматизация надёжнее инструкции).

Типичные проблемы: НО! Есть беда: ДВА npm процесса в одной папке! Они дерутся за одно место — могут залочить друг друга. Это моя ошибка — старый не до конца умер. Чиню по канону НО! Есть беда: тул объявлен в каталоге, но вызов даёт «Unknown tool» (camoufox.research, camoufox.web_search, даже ping). Каталог врёт: тулы зарегистрированы, но рантайм их не видит/не может вызвать. Это не «тула нет» — это MCP отвалился или кэш устарел. Чиню по канону:

  1. НЕ долбить один и тот же тул 4 раза подряд — если «Unknown tool», тул не оживёт от повторов.
  2. Сразу переключиться на запасной канон: websearch + webfetch (10+ источников, правило 6-8 работает и без camoufox).
  3. Сказать пользователю: «camoufox отвалился, нужен перезапуск сессии / переподключение MCP» — по канону индустрии чинится: новый chat session + hard restart + переподключение MCP сервера (MCP Inspector, tools/list, health_check).
  4. Проверить, что сервер жив: другой тул того же неймспейса (ping/fetch_page). Если мёртв весь неймспейс — дело в подключении, а не в имени тула.
  5. Проверено на практике: opencode2 service restart + opencode2 mcp list (✓ connected) НЕ оживляют тулы в старой сессии — её кэш тулов мёртв навсегда. Живая проверка: opencode2 run --auto "вызови camoufox.ping" — если в новой сессии pong, а в текущей Unknown tool — тулы работают, но текущую сессию надо закрыть и открыть НОВЫЙ чат. Это лечится только новой сессией, рестарт сервиса не помогает.

МОНИТОРИНГ ДОЛГОГО ПРОЦЕССА: НЕ СПАТЬ СЛЕПО — ПЕРЕХВАТ СМЕРТИ + УВЕДОМЛЕНИЕ (авг 2026) — РЕШЕНО ✅

Проблема: петля sleep 180; ps -p PID; ... = слепой сторож. Процесс умер на 10-й секунде — узнаешь на 180-й. Машину выключил — вообще никто не узнает. sleep = «подожду 3 минуты», wait = «проснись, КОГДА умрёт».

Канон (23 источника: GNU bash manual, LinuxCapable, Linuxize, Baeldung, linuxvox (wait / waitpid+timeout), SO 79419573 (wait -n), SO 10028820 (wait+timeout, kill -0), telegram-notify (samsulmaarif), Notify-me (Helias), linuxscriptshub / dev.to / giddi.net (telegram из bash), man7 systemd-run (--wait/--unit/--property), troglobit/watchdogd, diffstorm/processWatchdog, SO 31026279 (watchdog против зависших)):

  • sleep = пауза ради паузы; wait = событийное ожидание, просыпается РОВНО в момент смерти (LinuxCapable: wait и sleep отвечают на РАЗНЫЕ вопросы).
  • kill -0 $PID = «жив?» БЕЗ ps и grep — мгновенно, работает для ЛЮБОГО PID (не только детей шелла), без прав.
  • wait $PID = ждать и ПОЛУЧИТЬ exit-код, но ТОЛЬКО для детей своего шелла (чужой PID → «not a child of this shell», SO 10028820).
  • exit-код = единственная правда «кончился или нет» (правило 10 файла: не верить «running»).

🟢 УРОВЕНЬ 1 — перехват смерти за секунды (MVP, нативно)

Вместо слепого sleep-цикла — цикл с kill -0 (просыпается через 5с после смерти, НЕ через 180):

cd /путь/к/игре
WINEDEBUG=+loaddll wine my-app.exe > /tmp/acodyssey2.log 2>&1 &
PID=$!

# событийный сторож: умер → цикл падает МГНОВЕННО
while kill -0 $PID 2>/dev/null; do sleep 5; done
echo "УМЕР"

# улики СРАЗУ, а не через 3 минуты:
nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader
grep -cE "err:" /tmp/acodyssey2.log
tail -30 /tmp/acodyssey2.log

Если процесс запущен ЭТИМ ЖЕ шеллом — ещё проще, exit-код в руки:

wait $PID; RC=$?
echo "rc=$RC"   # 0 = сам закрылся, 1+ = упал/убит
  • wait -n (bash 4.3+) — «проснись, когда КТО-ТО из фоновых умрёт» (несколько задач сразу).
  • wait -p VAR -n (bash 5.1+) — и узнать, КТО именно.
  • wait -f PID — ждать реальной смерти, а не «остановки» (kill -STOP).
  • Максимум ожидания: DEADLINE=$((SECONDS+1800)); while kill -0 $PID 2>/dev/null && [ $SECONDS -lt $DEADLINE ]; do sleep 5; done (SO 10028820). Самому процессу — timeout -k 5 1800 cmd (SIGTERM, потом -k SIGKILL).

🟢 Уведомление о смерти (локально + в телефон)

Локально (env GUI — как в разделе про Firefox):

GPS=$(pgrep -f 'gnome-s[h]ell' | head -1)
export $(tr '\0' '\n' < /proc/$GPS/environ 2>/dev/null | grep -E '^(DISPLAY|WAYLAND_DISPLAY|XAUTHORITY|XDG_RUNTIME_DIR)=' | tr '\n' ' ')
notify-send "my-app умер" "rc=$RC"

В телефон — Telegram бот, 1 curl-строка (канон Helias/telegram-notify/linuxscriptshub):

TOKEN="ТОКЕН_ОТ_BotFather"; CHAT_ID="ТВОЙ_ID"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" -d chat_id=$CHAT_ID -d text="my-app УМЕР rc=$RC"

🟡 УРОВЕНЬ 2 — процесс под systemd (переживает закрытие терминала)

systemd-run --user --unit=... --wait (man7): процесс уходит под systemd, живёт БЕЗ терминала, --wait блокирует до конца и отдаёт exit-код, дальше &&/|| — уведомление:

systemd-run --user --unit=acod --collect --wait \
  bash -c 'cd /путь && WINEDEBUG=+loaddll wine my-app.exe > /tmp/acodyssey2.log 2>&1' \
  && notify-send "my-app: готово ✅" \
  || notify-send "my-app: УМЕР ❌"

Плюсы: cgroup (убить всю семью: systemctl --user kill acod), systemctl --user status acod, journalctl --user -u acod, лог не теряется при смерти терминала.

🔴 УРОВЕНЬ 3 — постоянный сторож (для серверов)

watchdogd (troglobit), processWatchdog (diffstorm), monit, systemd Restart=always + linger (раздел «Автозапуск» выше) — демоны с авто-рестартом и алертами. Для одной игры на десктопе — оверкилл (правило градации: начинать с 🟢).

Выключил машину — что перехватит?

Ничего, что крутится НА ЭТОЙ машине. Ответ индустрии: процесс должен жить ПОД systemd (systemd-run или юзер-сервис + linger, раздел «Автозапуск») — при загрузке systemd сам поднимет (Restart=always), а само «машина выключилась» перехватывает ТОЛЬКО внешний мониторинг (Telegram-бот на другом сервере / uptime-сервис). Для локальной игры достаточно 🟢: перехват за ~5с + notify-send + Telegram.

Проверено на этой машине (23 авг 2026): kill -0 цикл перехватил смерть за 3с при жизни процесса 3с (а не 180) ✅; wait вернул rc=0 и rc=1 (exit-код доезжает) ✅; kill -0 на чужой/мёртвый PID → dead, wait — только на детей ✅.


相关技能