---
title: "Ser avisado quando um comando longo termina no terminal"
description: "Pare de ficar de babá de um build de quarenta minutos. Uma linha depois de qualquer comando manda o resultado para o seu celular, inclusive se você já saiu."
date: 2026-09-09
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - terminal
  - shell
  - notificações de build
  - agentes de código com IA
  - notificações webhook
---

# Ser avisado quando um comando longo termina no terminal

Você dispara um treinamento, uma suíte de testes completa, um `docker build` ou um agente de código numa tarefa longa. Aí sobram duas opções ruins: sentar e olhar uma barra de progresso, ou sair e voltar vinte minutos depois para descobrir que falhou aos noventa segundos.

Existe uma terceira opção e ela cabe em uma linha.

## A linha

Crie um canal no Echobell, copie a URL de webhook dele e acrescente isto depois do que você estiver rodando:

```bash
pnpm build; curl -sS -X POST https://hook.echobell.one/t/SEU_TOKEN \
  -H 'content-type: application/json' \
  -d '{"title":"build terminou","body":"echobell-web"}'
```

Repare no `;` e não no `&&`. Com `&&` a notificação só dispara quando o comando dá certo, o que é exatamente ao contrário: a falha é o caso sobre o qual você mais quer saber.

## Mande o código de saída também

Uma notificação que diz "terminou" conta metade da história. Capture o status:

```bash
pnpm build; s=$?; curl -sS -X POST https://hook.echobell.one/t/SEU_TOKEN \
  -H 'content-type: application/json' \
  -d "{\"title\":\"build $([ $s -eq 0 ] && echo ok || echo FALHOU)\",\"status\":\"$s\"}"
```

`s=$?` precisa vir imediatamente depois do comando — qualquer coisa no meio, incluindo o próprio teste `[`, sobrescreve `$?`.

## Transforme numa função de shell

Digitar isso toda vez derruba o propósito. Coloque isto no `~/.zshrc` ou `~/.bashrc`:

```bash
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
}
```

Defina `ECHOBELL_HOOK` no perfil do seu shell — ou melhor, mantenha fora do repositório de dotfiles e exporte de um arquivo que você não versiona. Depois:

```bash
notify pnpm test
notify cargo build --release
notify python train.py
```

O `return $status` no fim importa: mantém o `notify` transparente, então `notify make && ./deploy.sh` continua se comportando como você espera.

Com esse payload, os templates do canal podem ser:

**Título**

```
{{command}} · {{status}}
```

**Corpo**

```
em {{host}}
```

## Só me ligue quando falhar

A maioria das execuções dá certo e você não precisa ouvir sobre elas. Dois canais resolvem isso direito: um normal para tudo e um de chamada com uma condição:

```
status != "0"
```

Aponte o `notify` para o segundo canal naquilo que faria você levantar da cama, e as execuções bem-sucedidas ficam em silêncio.

## Sobrevivendo a um notebook fechado e a uma sessão SSH caída

Se o comando roda por SSH, fechar o notebook mata o shell e a notificação nunca sai. Duas saídas:

**tmux** — inicie o comando dentro de uma sessão e desanexe:

```bash
tmux new -d -s build 'notify pnpm build'
```

**nohup** — para uma vez só:

```bash
nohup bash -c 'notify pnpm build' >/dev/null 2>&1 &
```

Nos dois casos o processo sobrevive à sua conexão, e a notificação chega estando você conectado ou não.

## Agentes de código com IA

O mesmo padrão cobre um agente de CLI trabalhando numa tarefa longa:

```bash
notify codex exec "refatore o módulo de pagamentos e rode os testes"
```

Para agentes que param no meio e esperam por uma pessoa — uma aprovação, um pedido de permissão — uma notificação de conclusão é a ferramenta errada, porque a execução não terminou. Esse caso pede o hook ou callback do próprio agente, e merece uma ligação em vez de um push. [Transformar aprovações de agente em ligações](/pt/blog/ai-agent-human-in-the-loop-alerts) cobre isso, incluindo o hook `Notification` do Claude Code e seu matcher `agent_needs_input`.

Use os dois: o hook para "estou travado", a função de shell para "terminei".

## O que não colocar na notificação

**A saída do comando, não.** É tentador jogar as últimas linhas de um build que falhou no corpo. Resista: logs de build contêm tokens, strings de conexão e dados de cliente com mais frequência do que se imagina, e o corpo de uma notificação acaba numa tela bloqueada. Mande o código de saída e vá olhar o terminal.

**A URL do canal, também não, num repositório público de dotfiles.** Qualquer um com a URL pode postar no seu canal. Guarde num arquivo fora do versionamento e ligue **Somente POST**, para uma prévia de link perdida não disparar nada.

## Perguntas frequentes

### Por que não usar `terminal-notifier` ou `notify-send`?

Esses mostram uma notificação na máquina que roda o comando. Funcionam enquanto você está sentado nela. O ponto desta montagem é o caso em que você não está: uma máquina remota, um notebook fechado, outro cômodo.

### Funciona no Windows?

O padrão sim, a sintaxe muda. No PowerShell o equivalente é `Invoke-RestMethod -Method Post -Uri $env:ECHOBELL_HOOK -ContentType application/json -Body $json`, com `$LASTEXITCODE` no lugar de `$?`.

### Consigo receber no relógio?

Sim. As assinaturas entregam num Apple Watch pareado, que é sinceramente o formato certo para "o build acabou".

### E se o comando levar 12 horas?

Nada nessa montagem expira — o `curl` roda quando o comando retorna. Execute sob tmux para que uma queda de conexão não leve o processo junto.

### Meus colegas podem receber as mesmas notificações?

Podem. Compartilhe o canal e cada assinante escolhe o próprio tipo de notificação. Útil numa máquina de treinamento compartilhada onde mais de uma pessoa se importa que a GPU ficou livre de novo.

## Fechando

Uma função de shell, um canal, e uma condição se você só quer as falhas. Leva uns dois minutos para montar e devolve os vinte que você passa olhando barra de progresso.

[Baixe o Echobell para iPhone](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-notify-when-terminal-command-finishes-pt&mt=8) ou [pegue no Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), depois teste em algo demorado o bastante para você sair de perto.

---

## Conteúdo relacionado

- [Transformar aprovações de agente em ligações](/pt/blog/ai-agent-human-in-the-loop-alerts)
- [Nunca perca uma falha do GitHub Actions](/pt/blog/github-actions-notifications)
- [Alertas de falha em cron jobs](/pt/blog/cron-job-failure-alerts)
- [Documentação do gatilho webhook](/pt/docs/webhook)
- [Referência das condições de canal](/pt/docs/conditions)
