Skip to content

[Bug]: HTML preview browsers are never stopped inside an LXC container after t3 browser setup, and pile up #27136

Closed

Description

@shirsenh

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

Server: HTML preview rendering (apps/server/src/htmlRender/headlessChrome.ts)

Steps to reproduce

  1. Run the T3 Code server (t3 v0.1.1) on Ubuntu 24.04 inside an LXC container.
  2. Run t3 browser setup. It writes /etc/apparmor.d/t3-chrome-headless-shell (flags=(unconfined), userns).
  3. Use chats that render HTML previews for a few hours.
  4. List chrome-headless-shell processes whose --user-data-dir is under /tmp/t3-html-preview-*.

Expected behavior

Each preview browser exits when its capture finishes.

Actual behavior

The t3-html-preview-* temp directory is removed, but the browser keeps running. After about 14 hours there were 7 orphaned browsers using 113 to 235 MB each, about 1.3 GB in total.

Every attempt to stop one returns EPERM:

  • kill as the same user
  • kill as root via sudo
  • systemctl --user stop on its scope, which logs Failed to kill control group ... Permission denied
  • aa-exec -p t3-chrome-headless-shell -- kill

A normal process started by the same user can be killed. The browsers run under the AppArmor label t3-chrome-headless-shell, and every sender was unconfined.

Impact

Each preview leaks a browser that can't be stopped, so memory grows until the container restarts.

Version or commit

t3 v0.1.1, chrome-headless-shell 154.0.8037.92

Environment

Ubuntu 24.04.4 LTS in an LXC container (systemd-detect-virt -c reports lxc), kernel 7.0.0-34-generic.

Logs or stack traces

systemd[3738]: app-org.chromium.Chromium-1051116.scope: Failed to kill control group /user.slice/user-1002.slice/user@1002.service/app.slice/app-org.chromium.Chromium-1051116.scope, ignoring: Permission denied

Guess at the cause (unconfirmed): AppArmor stacking in LXC blocks signals sent to a process under a different label, so the server's cleanup can't stop the browser.

Workaround

None found short of restarting the container.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions