Skip to content

feat(executor): forward signals to sandboxed process group to prevent orphans#39

Merged
Pierozi merged 1 commit intomainfrom
fix/signal-process
Apr 27, 2026
Merged

feat(executor): forward signals to sandboxed process group to prevent orphans#39
Pierozi merged 1 commit intomainfrom
fix/signal-process

Conversation

@Pierozi
Copy link
Copy Markdown
Contributor

@Pierozi Pierozi commented Apr 27, 2026

Closes #37

Summary

  • When sx receives SIGINT/SIGTERM/SIGHUP, descendant processes in the sandboxed subtree were left orphaned and reparented to launchd — accumulating silently over time (especially Node --useNodeIpc workers).
  • Spawning the sandboxed child in its own process group (process_group(0)) and forwarding signals via kill(-pgid, ...) ensures the entire subtree is torn down with a SIGTERM → 2s grace → SIGKILL escalation.
  • A PgidKillGuard RAII type provides panic-safe cleanup so the subtree is never orphaned even on unexpected exit paths.

Test plan

  • cargo test passes — unit test verifies process_group(0) produces an isolated pgid
  • cargo test --test signal_test passes — integration test asserts zero descendants remain 3s after SIGTERM to sx
  • Manual test with scripts/test-signal-tsserver.sh

… orphans

Fixes issue #37: when sx receives SIGINT/SIGTERM/SIGHUP it now delivers the
signal to the entire sandboxed process group via kill(-pgid, ...), followed
by a 2s grace period and SIGKILL escalation. A RAII PgidKillGuard ensures
the subtree is cleaned up even on unexpected exit paths.

- Add signal-hook and libc dependencies
- Spawn child in its own process group (process_group(0))
- Add spawn_with_signal_forwarding with SIGTERM→SIGKILL escalation
- Add PgidKillGuard for panic-safe cleanup
- Add unit test for process group isolation
- Add integration tests (tests/signal_test.rs) covering SIGTERM propagation
  and document the known SIGKILL limitation
@Pierozi Pierozi merged commit bd740fd into main Apr 27, 2026
6 checks passed
Pierozi added a commit that referenced this pull request Apr 27, 2026
)

When the sandboxed child was placed in its own process group (#39),
it was no longer the tty foreground group, causing SIGTTIN on any
tty read and hanging interactive shells.

Add TtyForegroundGuard: hands the tty foreground to the child pgrp
via tcsetpgrp after spawn (SIGTTOU suppressed during handoff) and
restores the original foreground on drop.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: sx does not forward signals, orphaning IPC children on exit

1 participant