Comando travado no Claude Code: como interromper sem perder a sessão?

Comando travado no Claude Code quase nunca precisa de terminal fechado no grito. A ordem certa é: Esc primeiro, que cancela a chamada de ferramenta em execução e te devolve à mesma sessão; Ctrl+B depois, que joga a execução da Bash para segundo plano (duas vezes no tmux) e cria uma tarefa com ID próprio, listada pelo /bashes, alias de /tasks; Ctrl+C só por último, lembrando que o primeiro limpa o input e o segundo encerra o Claude Code. Se já saiu, /resume ou claude --continue reabrem a conversa com o mesmo session ID.
O cursor parado, nenhuma linha nova na tela, e aquela dúvida chata batendo: eu mato o terminal e perco tudo, ou espero mais cinco minutos?
Fala aí, beleza? Essa cena é clássica, e a reação instintiva (fechar tudo no grito) costuma ser a pior possível
Porque comando travado no Claude Code não é a mesma coisa que modelo pensando
Quando o modelo está trabalhando, ele está gerando resposta e a coisa anda, mesmo que devagar
Quando o comando trava, quem está pendurado é o processo que a ferramenta Bash abriu, e o Claude fica ali esperando um retorno que não vem
São problemas diferentes, com saídas diferentes, e nenhuma delas exige encerrar a conversa 🙂
Como saber se quem travou foi o comando e não o modelo
Sintoma: nada aparece na tela por um tempo longo demais e você não consegue dizer se o Claude está raciocinando ou se o processo ficou pendurado
Causa: a chamada da ferramenta Bash segue aberta, esperando um processo que não termina ou uma entrada que nunca chega
Solução: olhe o que foi executado antes do silêncio
Se foi um servidor, um watcher ou qualquer coisa feita pra ficar viva, o comando não vai retornar sozinho, nunca
Se foi um comando que abre sessão interativa, pior ainda: a ferramenta Bash do Claude Code não tem suporte a pseudo-terminal (PTY), então esse tipo de execução simplesmente empaca
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 114 aulas
- 4 projetos
- 9h 18min
E tem um marcador de tempo que ajuda: o BASH_DEFAULT_TIMEOUT_MS tem valor padrão de 120000 milissegundos, ou seja, 2 minutos
Então silêncio muito acima disso, sem retorno e sem erro, é sinal forte de comando preso e não de modelo raciocinando
Como prevenir: repare no TIPO de comando antes de aprovar a execução
Servidor, watcher e prompt interativo pedem tratamento diferente, e dá pra decidir isso antes de apertar o botão
E se o travamento começou logo depois de você instalar alguma coisa nova no ambiente, a investigação é outra: vale seguir o diagnóstico de ferramenta não reconhecida antes de culpar a Bash
O comando não termina sozinho (servidor, watcher, build em loop)
Sintoma: você pede um npm run dev, um watcher ou qualquer processo de longa duração, e a sessão fica refém
O terminal segue vivo, cuspindo log, e o Claude não volta pra você
Causa: esses processos são feitos pra não terminar
Não tem bug aqui, tem incompatibilidade de expectativa: a ferramenta espera um comando que acaba, e você entregou um que foi projetado pra ficar de pé
Solução: manda pro segundo plano
O Ctrl+B move uma execução da ferramenta Bash para segundo plano
Se tu usa tmux, aperta duas vezes, porque a primeira é consumida pela tecla prefixo do próprio tmux (fica a dica pra não achar que o atalho está quebrado)
O mesmo Ctrl+B vale no modo bash com prefixo !, quando é você quem está rodando o comando longo na mão
A partir daí:
- cada tarefa em segundo plano ganha um ID único pra rastreio
- a saída vai pra um arquivo em vez de inundar a conversa
- o Claude recupera esse conteúdo com a ferramenta Read, quando precisar olhar
- o
/bashes, que é alias de/tasks, lista e gerencia o que está rodando
O erro comum aqui é esquecer que o /bashes existe e ficar tentando adivinhar o estado da tarefa pelo silêncio da tela
Se você ainda embaralha o que é slash command, o que é subagente e o que é skill, dá uma olhada na diferença entre skills, comandos e subagentes antes de seguir
Como prevenir: processo de longa duração já nasce em segundo plano
Não espere travar pra depois reagir
O comando está esperando você digitar algo (vim, git rebase -i, npm init, REPL)
Sintoma: a execução fica parada e nada é pedido na tela
Ou pior: o comando termina em silêncio, sem erro nenhum, e o valor que deveria ser aplicado simplesmente não foi aplicado
Causa: a ferramenta Bash não oferece suporte a shell interativo via PTY
Tem um pedido de funcionalidade aberto no repositório oficial do Claude Code descrevendo exatamente isso: comandos que abrem sessão interativa (como vim, git rebase -i, npm init ou um REPL) fazem a sessão travar, esperar o timeout ou falhar
E tem uma issue separada sobre prompts interativos de stdin, onde o relato é o do desaparecimento silencioso: o prompt nunca aparece e o comando encerra sem aplicar nada
Ou seja, não é você que está fazendo errado, e não adianta esperar mais um pouquinho
Solução: aperta Esc
Esse é o primeiro degrau em qualquer travamento, seja qual for a causa: o Esc cancela a chamada de ferramenta em execução e te mantém na MESMA sessão, esperando a próxima instrução
Depois disso, você reformula o pedido em forma não interativa (a próxima seção é só sobre isso)
Em execução não interativa, ainda dá pra blindar o stdin:
claude -p "prompt" < /dev/null
Redirecionando de /dev/null, o Claude não fica esperando uma entrada que ninguém vai digitar
Como prevenir: evita pedir comando que abre sessão interativa
Se o comando normalmente abriria um editor ou um menu no teu terminal, ele vai travar ali dentro
Como pedir a mesma tarefa de um jeito que não trava
A maior parte dos travamentos não é problema de ferramenta, é problema de formulação do pedido
A tarefa é legítima, o caminho é que era interativo
Se liga nos padrões de reformulação:
| O que trava | Como pedir pra não travar |
|---|---|
| Editor interativo (abrir arquivo pra editar na mão) | Pedir a edição direta do arquivo, com o conteúdo final descrito |
| Comando que abre sessão e fica de pé | Pedir uma execução única, que roda e retorna |
| Servidor, watcher, build em loop | Rodar e mandar pro segundo plano com Ctrl+B, acompanhando pelo /bashes |
| Execução automatizada que pode pedir input | Redirecionar o stdin de /dev/null no modo não interativo |
Repara que nenhuma dessas saídas exige flag mágica nem prompt secreto
É só trocar "abre isso pra mim" por "faz isso e me devolve o resultado"
E quando o processo PRECISA ficar vivo, ele fica vivo, só que fora do caminho da conversa
Ajustar o timeout quando o comando é legitimamente longo
Sintoma: o comando não travou coisa nenhuma, ele só demora mais que o padrão
Build pesado, suite de testes grande, aquela tarefa que na tua máquina leva um tempão
Causa: o BASH_DEFAULT_TIMEOUT_MS é o timeout padrão para comandos Bash longos, e o valor padrão dele é 120000 ms (2 minutos)
Já o BASH_MAX_TIMEOUT_MS define o teto de timeout que o modelo pode solicitar
Solução: essas variáveis podem ser configuradas sob a chave env no settings.json
{
"env": {
"BASH_DEFAULT_TIMEOUT_MS": "120000",
"BASH_MAX_TIMEOUT_MS": "<valor em ms>"
}
}
O 120000 aí em cima é o valor padrão do BASH_DEFAULT_TIMEOUT_MS, servindo só de referência: troca pelo número de milissegundos que faz sentido pro teu comando
No BASH_MAX_TIMEOUT_MS tu coloca, também em milissegundos, o teto que o modelo pode solicitar
Tome cuidado com um detalhe que pega muita gente: as variáveis de ambiente são lidas na inicialização
Mudou o arquivo? A mudança vale na PRÓXIMA vez que você abrir o Claude Code, não na sessão que já está rodando
O erro comum deste passo é editar o settings.json, testar na mesma sessão, ver que nada mudou e achar que a configuração não funciona
E tem uma variável que merece um aviso grande: CLAUDE_CODE_DISABLE_BACKGROUND_TASKS definida como 1 desativa toda a funcionalidade de tarefas em segundo plano
Se você colocou isso aí em algum momento e agora o Ctrl+B não te ajuda mais, já sabe onde olhar 😀
Ctrl+C como último recurso: como voltar sem perder a conversa
Sintoma: o Esc e o segundo plano não resolveram (ou o pânico falou mais alto), você apertou Ctrl+C duas vezes e o Claude Code fechou no meio da tarefa
Causa: o comportamento é esse mesmo
O primeiro Ctrl+C limpa a entrada e a fila de prompts
O segundo encerra o Claude Code
Por isso ele fica no fim da fila: é o único dos três que tira você da sessão
Solução: respira, porque a conversa não evaporou
Uma sessão é uma conversa salva atrelada a um diretório de projeto, armazenada localmente enquanto você trabalha
Pra voltar:
- dentro do Claude Code, roda
/resume(que tem/continuecomo alias) pra retomar por ID, por nome, ou pra abrir o seletor de sessões - pelo terminal, a flag
claude --continue(ou-c) é outra coisa: ela carrega direto a conversa mais recente do diretório atual, sem seletor - se você tem o ID em mãos,
claude --resume <session-id>vai direto na sessão certa
claude --continue
Retomando por qualquer um desses caminhos, a sessão reabre com o MESMO session ID e as novas mensagens são anexadas à conversa existente
O erro comum deste passo é rodar o claude de outra pasta e achar que perdeu tudo: a flag --continue pega a conversa mais recente do diretório atual, então a pasta importa
E se o problema não foi a saída, mas o que o Claude fez antes de travar?
Aí o caminho é o /rewind, que também abre apertando Esc duas vezes com o campo de prompt VAZIO
Detalhe que confunde: se tiver texto no campo, o Esc duplo só limpa o texto em vez de abrir o menu de rewind
Como prevenir: Esc antes de pensar em Ctrl+C
O Esc cancela a chamada de ferramenta e te deixa na sessão, que é exatamente o que você queria quando entrou em pânico
Na prática: rodando tarefas longas em paralelo sem travar a sessão
Quando gravei o vídeo sobre o /goal, o comando do Claude Code que trabalha sozinho até terminar, essa lógica de "não travou, só está rodando" ficou bem clara na tela
Eu deixei duas rotinas autônomas rodando em paralelo na máquina e fiquei só acompanhando o andamento enquanto seguia com o projeto
Com a tarefa em andamento no terminal, apertei ESC e voltei pra sessão de prompt sem encerrar o que estava rolando: o trabalho seguiu, e eu voltei a conversar
A interface ainda mostrava o indicador de status avisando que tinha rotina ativa, e eu conseguia listar o que estava em execução
Uma coisa que descobri testando: nenhuma parada é instantânea
Quando pedi a pausa, o agente terminou o passo que estava executando antes de pausar
Ele inclusive respondeu na tela que tinha recebido a instrução e que ia interromper a análise depois de concluir o trecho em andamento
Eu li isso como proteção, não como lentidão: melhor terminar o passo do que deixar coisa pela metade
Depois retomei a execução e a tarefa continuou do ponto em que tinha parado
No cancelamento o comportamento foi o mesmo: o agente ainda finaliza a interação atual antes de sair, então demora um pouco pra encerrar de fato
E quando o objetivo já tinha sido atingido, marquei a rotina como concluída na mão, pra ele não ficar repetindo execução à toa
Ah, e precisei atualizar o Claude Code antes de conseguir usar o recurso, porque a versão que eu tinha era anterior à necessária
Se der erro de comando não encontrado, olha a versão antes de xingar a ferramenta 😛
O que eu recomendo pra esse tipo de execução longa: prompt com estado final MENSURÁVEL, uma forma do agente comprovar que chegou lá, e restrições opcionais do que ele não pode fazer
Serve bem pra tarefa longa, com objetivo claro, que não exige supervisão constante (teste repetitivo é o exemplo mais óbvio)
E vale ler a documentação oficial pra ver parâmetros, usos recomendados e limitações, que foi de lá que tirei a base
Os limites do segundo plano que você precisa conhecer:
Segundo plano não é terra sem lei, e conhecer os limites evita susto:
- uma tarefa em segundo plano é encerrada automaticamente se a saída ultrapassar 5GB, com uma nota no stderr explicando o motivo
- no macOS e no Linux, o Claude Code encerra tarefas em segundo plano quando o sistema operacional sinaliza pressão de memória, desde que a sessão esteja ociosa há pelo menos 30 minutos e nenhum turno ou subagente esteja rodando
- as tarefas em segundo plano são limpas automaticamente quando o Claude Code é encerrado
Esse último ponto é o que mais gera confusão: sair do Claude Code não deixa as tarefas penduradas em algum limbo, elas vão junto
Conclusão
A escada de reação pra comando travado no Claude Code é curta e vale decorar, sempre nessa ordem:
Escprimeiro, em qualquer travamento, porque ele cancela a chamada de ferramenta em execução e te mantém na mesma sessãoCtrl+Bna sequência, quando o processo é longo por natureza (servidor, watcher, build), mandando pro segundo plano com ID próprio e saída em arquivoCtrl+Csó por último, sabendo que o primeiro limpa o input e o segundo encerra o Claude Code
E se encerrou mesmo, /resume dentro do Claude Code ou a flag claude --continue no terminal trazem a conversa de volta com o mesmo session ID
Antes de precisar de tudo isso, faz duas coisas: revisa a chave env do teu settings.json (timeout e a variável que desliga o segundo plano) e testa o /bashes na próxima tarefa longa que você rodar
É muito mais tranquilo aprender o atalho com a sessão calma do que descobrindo no susto, né? 😀
até o próximo post!
Perguntas frequentes
Apertar Esc encerra a sessão do Claude Code junto com o comando travado?
Não. O Esc cancela a chamada de ferramenta em execução e mantém você na mesma sessão, esperando a próxima instrução. Nada da conversa se perde, é só a execução travada que é interrompida.
Qual a diferença entre apertar Ctrl+C uma vez e duas vezes no Claude Code?
A primeira vez limpa a entrada ou a fila de prompts, sem sair de nada. A segunda vez, em sequência, encerra o Claude Code de verdade, então vale usar com cuidado quando o objetivo é só limpar o campo.
Dá para retomar a sessão depois de lidar com um comando travado no Claude Code?
Sim, e são dois caminhos diferentes. Dentro do Claude Code, o /resume (que tem /continue como alias) retoma a conversa por ID, por nome ou abre o seletor de sessões. Já no terminal, a flag claude –continue (ou -c) carrega direto a conversa mais recente do diretório atual, sem passar pelo seletor, e claude –resume aceita um session ID. Em qualquer um deles a sessão reabre com o mesmo session ID, anexando as novas mensagens à conversa existente.
As tarefas em segundo plano continuam rodando depois que eu fecho o Claude Code?
Não, elas passam por cleanup automático quando o Claude Code é encerrado. Além disso, no macOS e no Linux uma tarefa também é encerrada se o sistema sinalizar pressão de memória, desde que a sessão esteja ociosa há pelo menos 30 minutos e nenhum turno ou subagente esteja rodando.
Uma tarefa em segundo plano pode gerar log grande demais e travar o Claude Code?
Existe um limite: se a saída ultrapassar 5GB, a tarefa é encerrada automaticamente e uma nota no stderr explica o motivo. Fora esse teto, a saída fica gravada em arquivo e o Claude lê com a ferramenta Read quando precisa consultar.
Dá para mudar o tempo até um comando Bash ser considerado travado?
O BASH_DEFAULT_TIMEOUT_MS controla esse tempo padrão e vem configurado em 120000 milissegundos, ou seja, 2 minutos. Já o BASH_MAX_TIMEOUT_MS define o teto que o modelo pode solicitar para um comando mais longo, e ambos ficam sob a chave env do settings.json, lidos na inicialização, então a mudança só vale na próxima vez que o Claude for aberto.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
Como pagar o Claude Code no Brasil: cartão, dólar, IOF e quanto fica em reais
Claude Code preço Brasil na prática: câmbio, IOF de 3,5% e quanto fica na fatura. Planos Pro e Max convertidos em reais e como pagar com cartão.
Como instalar uma skill no Claude Code: passo a passo
Saiba como instalar skill no Claude Code: use a pasta pessoal para todas as sessões ou a pasta de projeto para versionar. Frontmatter YAML é obrigatório.
Bateu o limite de uso do Claude Code? Como retomar a tarefa sem refazer tudo
Bateu o limite de uso do Claude Code? Veja como retomar a tarefa de onde parou com /usage, CLAUDE.md e --continue, sem refazer nada.
