Spis treści
- Ta jedna linijka
- Wyślij też kod wyjścia
- Zrób z tego funkcję powłoki
- Dzwoń tylko, gdy się wywali
- Przetrwać zamknięty laptop i zerwaną sesję SSH
- Agenci kodujący AI
- Czego nie wkładać do powiadomienia
- Najczęstsze pytania
- Czemu nie użyć terminal-notifier albo notify-send?
- Czy to działa na Windowsie?
- Czy dostanę powiadomienie na zegarek?
- A jeśli polecenie trwa 12 godzin?
- Czy koledzy z zespołu mogą dostawać te same powiadomienia?
- Podsumowanie
- Powiązane treści
Odpalasz trening, pełny zestaw testów, docker build albo agenta kodującego przy długim zadaniu. Zostają ci dwie złe opcje: siedzieć i patrzeć na pasek postępu, albo odejść i wrócić dwadzieścia minut później, żeby odkryć, że wywaliło się po dziewięćdziesięciu sekundach.
Jest trzecia opcja i mieści się w jednej linijce.
Ta jedna linijka
Utwórz kanał w Echobell, skopiuj jego adres webhooka i dopisz to za tym, co uruchamiasz:
pnpm build; curl -sS -X POST https://hook.echobell.one/t/TWOJ_TOKEN \
-H 'content-type: application/json' \
-d '{"title":"build zakończony","body":"echobell-web"}'
Zwróć uwagę na ;, a nie &&. Przy && powiadomienie leci tylko wtedy, gdy polecenie się powiodło, a to jest dokładnie na odwrót — to o porażce chcesz wiedzieć najbardziej.
Wyślij też kod wyjścia
Powiadomienie mówiące „zakończone" opowiada połowę historii. Przechwyć status:
pnpm build; s=$?; curl -sS -X POST https://hook.echobell.one/t/TWOJ_TOKEN \
-H 'content-type: application/json' \
-d "{\"title\":\"build $([ $s -eq 0 ] && echo ok || echo BLAD)\",\"status\":\"$s\"}"
s=$? musi być bezpośrednio po poleceniu — cokolwiek pomiędzy, łącznie z samym testem [, nadpisze $?.
Zrób z tego funkcję powłoki
Wpisywanie tego za każdym razem niweczy sens. Wrzuć to do ~/.zshrc albo ~/.bashrc:
notify() {
"$@"
local status=$?
curl -sS -X POST "$ECHOBELL_HOOK" \
-H 'content-type: application/json' \
-d "{\"command\":\"$*\",\"status\":\"$status\",\"host\":\"$(hostname -s)\"}" \
>/dev/null
return $status
}
Ustaw ECHOBELL_HOOK w profilu powłoki — a lepiej trzymaj go całkiem poza repozytorium dotfiles i eksportuj z pliku, którego nie commitujesz. Potem:
notify pnpm test
notify cargo build --release
notify python train.py
Końcowe return $status ma znaczenie: utrzymuje notify przezroczystym, więc notify make && ./deploy.sh nadal zachowuje się tak, jak się spodziewasz.
Z takim payloadem szablony kanału mogą wyglądać tak:
Tytuł
{{command}} · {{status}}
Treść
na {{host}}
Dzwoń tylko, gdy się wywali
Większość uruchomień kończy się dobrze i nie musisz o nich słyszeć. Dwa kanały załatwiają to czysto: zwykły na wszystko i połączeniowy z warunkiem:
status != "0"
Skieruj notify na drugi kanał dla tego, dla czego wstałbyś z łóżka, a udane uruchomienia zostaną ciche.
Przetrwać zamknięty laptop i zerwaną sesję SSH
Jeśli polecenie działa przez SSH, zamknięcie laptopa zabija powłokę i powiadomienie nigdy nie wychodzi. Dwa sposoby:
tmux — uruchom polecenie w sesji i odłącz się:
tmux new -d -s build 'notify pnpm build'
nohup — na jeden raz:
nohup bash -c 'notify pnpm build' >/dev/null 2>&1 &
W obu przypadkach proces przeżywa twoje połączenie, a powiadomienie dociera niezależnie od tego, czy jesteś jeszcze podłączony.
Agenci kodujący AI
Ten sam wzorzec obejmuje agenta CLI pracującego nad długim zadaniem:
notify codex exec "zrefaktoruj moduł płatności i uruchom testy"
Dla agentów, którzy zatrzymują się w połowie i czekają na człowieka — zgoda, prośba o uprawnienie — powiadomienie o zakończeniu jest złym narzędziem, bo uruchomienie się nie zakończyło. Ten przypadek potrzebuje własnego hooka albo callbacku agenta i zasługuje raczej na telefon niż na push. Zamiana bramek zatwierdzania agenta w połączenia telefoniczne omawia dokładnie to, łącznie z hookiem Notification w Claude Code i jego matcherem agent_needs_input.
Używaj obu: hooka do „utknąłem", funkcji powłoki do „skończyłem".
Czego nie wkładać do powiadomienia
Nie wyjścia polecenia. Kusi, żeby wrzucić ostatnie linijki nieudanego builda do treści. Powstrzymaj się: logi buildów zawierają tokeny, ciągi połączeń i dane klientów częściej, niż się ludziom wydaje, a treść powiadomienia ląduje na zablokowanym ekranie. Wyślij kod wyjścia i idź spojrzeć w terminal.
Nie adresu kanału do publicznego repozytorium dotfiles. Każdy, kto ma ten adres, może pisać na twój kanał. Trzymaj go w pliku poza wersjonowaniem i włącz Tylko POST, żeby zabłąkany podgląd linku go nie wyzwolił.
Najczęstsze pytania
Czemu nie użyć terminal-notifier albo notify-send?
One pokazują powiadomienie na maszynie, która wykonuje polecenie. Działa to, dopóki przy niej siedzisz. Cały sens tej konfiguracji to przypadek, gdy nie siedzisz: zdalna maszyna, zamknięty laptop, inny pokój.
Czy to działa na Windowsie?
Wzorzec tak, składnia inaczej. W PowerShellu odpowiednikiem jest Invoke-RestMethod -Method Post -Uri $env:ECHOBELL_HOOK -ContentType application/json -Body $json, a zamiast $? używa się $LASTEXITCODE.
Czy dostanę powiadomienie na zegarek?
Tak. Subskrypcje docierają na sparowany Apple Watch, który szczerze mówiąc jest właściwym formatem dla „build się skończył".
A jeśli polecenie trwa 12 godzin?
Nic tu nie wygasa — curl uruchamia się wtedy, gdy polecenie zwróci sterowanie. Odpal je pod tmuxem, żeby zerwane połączenie nie zabrało procesu ze sobą.
Czy koledzy z zespołu mogą dostawać te same powiadomienia?
Mogą. Udostępnij kanał, a każdy subskrybent wybierze własny typ powiadomienia. Przydatne na współdzielonej maszynie treningowej, gdzie więcej niż jedna osoba czeka, aż GPU znów będzie wolne.
Podsumowanie
Jedna funkcja powłoki, jeden kanał i warunek, jeśli chcesz tylko porażek. Konfiguracja zajmuje jakieś dwie minuty i oddaje ci te dwadzieścia, które spędzasz na gapieniu się w paski postępu.
Pobierz Echobell na iPhone'a albo weź go z Google Play, a potem wypróbuj na czymś na tyle długim, żeby odejść.