Canceled Codex task kept running/restarting in background and saturated server CPU

Open 💬 2 comments Opened Jun 4, 2026 by OkBayat

What version of Codex CLI is running?

codex-cli 0.137.0

What subscription do you have?

ChatGPT Pro

Which model were you using?

gpt 5.5 xhigh

What platform is your computer?

Linux 5.15.0-179-generic x86_64 x86_64

What terminal emulator and version are you using (if applicable)?

_No response_

Codex doctor report

What issue are you seeing?

A canceled/interrupted Codex task continued running or restarting in the background and saturated the server CPU.

The task was a heavy Node.js worker launched by Codex during an automated workflow. The command looked like this:

cd dist && STRATEGY_REVIEW_RUN_ID=StrategyAH75-test0 node src/test/worker-stream.js -S StrategyAH75 -I 1d,12h,8h --log true > test0 2>&1

Later, a similar background worker was still running:

330790 rtk proxy sh -lc cd dist && STRATEGY_REVIEW_RUN_ID=StrategyZR00-test5 node src/test/worker-stream.js -S StrategyZR00 -I 1d,12h --log true > test5 2>&1
330791 /usr/bin/sh -lc cd dist && STRATEGY_REVIEW_RUN_ID=StrategyZR00-test5 node src/test/worker-stream.js -S StrategyZR00 -I 1d,12h --log true > test5 2>&1
330798 node src/test/worker-stream.js -S StrategyZR00 -I 1d,12h --log true

The original Codex task had already been canceled/interrupted, but the worker continued consuming CPU. Killing the worker was not enough in all cases, because Codex app-server / proxy processes were still active or were recreated.

Observed Codex app-server/proxy processes:

338889 1 338610 Sl codex app-server --listen unix:///home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock
338991 338988 338991 Ss /bin/sh -c ... codex app-server proxy --sock /home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock
339301 338991 338991 Sl codex app-server proxy --sock /home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock

After killing them, new Codex app-server/proxy processes appeared:

341201 1 340898 Sl codex app-server --listen unix:///home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock
341303 341302 341303 Ss /bin/sh -c ... codex app-server proxy --sock /home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock
341614 341303 341303 Sl codex app-server proxy --sock /home/<user>/.codex/app-server-control/desktop-ssh-websocket-v0.sock

The parent process was:

341302 341248 341248 341248 S sshd: <user>@notty

This suggests that the desktop SSH websocket / Codex app-server proxy session was able to recreate the Codex app-server process after manual termination.

The problematic session id / thread id was:

019e927e-8ad8-7691-a663-6e0f9c3a7eda

A Codex session log also showed that the background command had been created by a previous Codex execution session, not by manual shell history:

~/.codex/sessions/2026/06/04/rollout-2026-06-04T11-43-13-019e9271-d33e-7863-96f8-8d0493dc3ffa.jsonl

The generated test log was incomplete and ended with:

Terminated

There were no expected KPI summary markers, so the worker had been interrupted. Despite that, related background work continued/retried and server CPU remained heavily loaded.

The main problem: after cancellation, Codex did not reliably terminate all background/child processes started by the canceled task, and it was difficult to discover and stop all related processes.

What steps can reproduce the bug?

I do not have a minimal standalone reproduction yet, but the observed sequence was:

Start Codex in desktop SSH websocket / app-server mode on a remote Linux server.
Ask Codex to run a workflow that launches a long-running CPU-heavy command.
The command is launched through a process chain similar to:
rtk proxy sh -lc 'cd dist && STRATEGY_REVIEW_RUN_ID=StrategyAH75-test0 node src/test/worker-stream.js -S StrategyAH75 -I 1d,12h,8h --log true > test0 2>&1'
Interrupt/cancel the Codex task before the worker completes.
Observe that the underlying worker can remain active in the background.
Check processes:
ps -eo pid,ppid,pgid,stat,cmd | grep -E 'codex|worker-stream.js|STRATEGY_REVIEW_RUN_ID|rtk proxy' | grep -v grep
Kill the worker and Codex app-server/proxy processes.
Observe that Codex app-server/proxy processes may reappear through a non-interactive SSH process:
sshd: <user>@notty
CPU remains heavily loaded until all related processes and the parent non-interactive SSH session are manually terminated.

Commands used to diagnose:

ps -eo pid,ppid,pgid,stat,cmd | grep -E 'codex|worker-stream.js|STRATEGY_REVIEW_RUN_ID|rtk proxy' | grep -v grep
pgrep -af 'worker-stream.js|StrategyAH75|StrategyZR00|STRATEGY_REVIEW_RUN_ID'
ps -p <PID> -o pid,ppid,pgid,sid,stat,cmd
pstree -aps <PID>

Manual cleanup required commands like:

pkill -TERM -u "$USER" -f 'worker-stream.js'
pkill -TERM -u "$USER" -f 'STRATEGY_REVIEW_RUN_ID'
pkill -TERM -u "$USER" -f 'rtk proxy'
pkill -TERM -u "$USER" -f 'codex app-server'

and also killing specific Codex app-server/proxy PIDs and the parent sshd: <user>@notty process.

What is the expected behavior?

When a Codex task is canceled/interrupted:

Codex should terminate the full process tree/process group started by that task.
Long-running background commands should not continue silently after cancellation.
Codex should not retry or resume canceled work unless the user explicitly asks for it.
The UI/CLI should clearly show any still-running background tasks after cancellation.
There should be a reliable command or UI action to stop all background work associated with the current Codex session.
Codex should not orphan heavy child processes under PID 1.
If codex app-server or codex app-server proxy restarts, it should not resume canceled task execution.
If the task was launched via desktop SSH websocket / non-interactive SSH, there should be a clean way to terminate that session and all descendants.

Additional information

This is high severity for remote development servers.

A canceled Codex task continuing to run in the background can:

saturate server CPU,
make the server difficult to use,
produce misleading or partial test logs,
continue expensive computation without user visibility,
require manual process-tree cleanup,
and make it hard to trust that canceling a task actually stopped the work.

Suggested improvements:

Track all child PIDs spawned by each Codex task.
On cancel, terminate the full process group/tree, including shell wrappers and proxy-launched commands.
Prevent canceled tasks from being retried automatically in the background.
Add a visible “stop all background tasks for this session” command.
Show still-running background commands after interruption.
Warn before starting long-running/high-CPU background commands.
Ensure app-server/proxy restart does not resume canceled tasks.
Provide a cleanup command for desktop SSH websocket sessions and their descendants.

View original on GitHub ↗

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