UI freezes completely when Bash tool blocks on named pipes (FIFO) - unrecoverable without external kill

Resolved 💬 3 comments Opened Dec 25, 2025 by samurax Closed Dec 29, 2025

Description

Claude Code UI becomes completely unresponsive when a Bash command blocks on reading from a named pipe (FIFO). The UI freezes entirely - no scrolling, no cancel button works, nothing responds until the blocking process is manually killed from another terminal.

Environment

  • Claude Code version: 2.0.76
  • OS: Linux 6.8.0-59-generic (Ubuntu)
  • Shell: Bash

Steps to Reproduce

  1. Create a named pipe: mkfifo /tmp/test_pipe
  2. In Claude Code, ask it to read from the pipe: "read /tmp/test_pipe" or "show me what's in /tmp/test_pipe"
  3. Claude executes cat /tmp/test_pipe or similar
  4. Result: Entire UI freezes indefinitely

Expected Behavior

  • Bash commands should have a reasonable default timeout
  • UI should remain responsive during command execution
  • Cancel/interrupt functionality should work
  • Or at minimum: warning when attempting to read from FIFO devices

Actual Behavior

  • UI completely freezes (no scrolling, no input, no cancel)
  • Only way to recover is to kill the blocking process from another terminal
  • Child bash process becomes zombie - parent Claude never reaps it
  • The FIFO file descriptor stays open on the Claude process

Verified Technical Details

Frozen session still running:

samurax  5872  6.6  1.7 74849296 507376 ?  Sl  11:09  2:05 claude

FIFO still held open by frozen Claude:

claude  5872 samurax  25r  FIFO  259,2  0t0  18481334  /inkode/ports/PESA

Child bash is zombie (never reaped):

samurax  7602  0.0  0.0  0  0 ?  Zs  11:13  0:00 [bash] <defunct>

Process tree showing zombie child:

claude(5872)-+-bash(7602)  # <-- zombie
             |-{claude}(5901)
             |-{claude}(5902)
             ...

Workaround

Use explicit timeouts when reading from pipes:

timeout 1 cat /path/to/pipe

Impact

  • High - Complete loss of session control
  • Cannot save work or gracefully exit
  • Requires external intervention to recover
  • Zombie processes accumulate
  • First observed on 2.0.76 (Dec 25, 2024)

Suggestions

  1. Run Bash commands with a configurable default timeout
  2. Keep UI event loop separate from command execution
  3. Add non-blocking I/O or polling for command output
  4. Detect FIFO/device special files before reading
  5. Ensure proper child process reaping (wait/waitpid)

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗