Lesstep
GitHub Actions · Ubuntu 26.04 · Checked November 4, 2026

"coreutils: unknown program" on ubuntu-latest (Ubuntu 26.04): uutils, the Rust coreutils

ubuntu-latest is moving from Ubuntu 24.04 to 26.04 between October 19 and November 19, 2026 (what else changes). On 26.04, most of the core tools (sleep, ls, cat, timeout and the rest) come from uutils, a Rust rewrite of GNU coreutils. Scripts and tests that relied on GNU's behavior break in a few ways, and the most common message is this one:

coreutils: unknown program 'codex'

A renamed copy of sleep

uutils ships one program for all the tools, and it decides which tool to be from the name it was called by. Tests often fake a long-running process by copying or linking sleep under another name, so that pgrep can find it. On 26.04 that copy exits at once (pithead #3783, crewship #4062):

coreutils: unknown program 'p2pool'

The test then fails somewhere else, waiting for a process that is already gone. A name that ends in the tool's name, such as fake-sleep, still works, because uutils matches the end of the name. Two fixes that work on both images:

timeout -k does not kill the whole process group

uutils timeout sends the first signal to the command's process group, as GNU does, but the KILL from -k or -s KILL goes only to the direct child (uutils #15768, open). Anything the command started keeps running: a step that used timeout -k to stop a stuck install now waits, and a test that expected the kill fails with its own timeout (openRepoTools #297). Use GNU's timeout, which 26.04 installs as gnutimeout (waitron #2400 does this):

T=$(command -v gnutimeout || command -v timeout)
"$T" -k 10 300 ./install.sh

Other differences seen in CI

To see which one a step got, ask the tool. On 26.04, timeout --version prints timeout (uutils coreutils) 0.10.0, and readlink -f "$(command -v sleep)" shows where the name points.

GNU's tools are still there

On 26.04 the coreutils package depends on coreutils-from-uutils, which depends on gnu-coreutils, so GNU's tools are always installed with a gnu prefix: gnusleep, gnutimeout, gnucat, gnudate, gnusort, gnutail and the rest. That is the smallest fix for one command. In an image you build from ubuntu:26.04, you can switch the whole set back, as some projects do in their Dockerfiles (kickstart-flavor-php #4):

apt-get install -y --allow-remove-essential coreutils-from-gnu coreutils-from-uutils-

Or pin the job with runs-on: ubuntu-24.04 until the scripts are fixed; it holds until GitHub retires 24.04. Either way, look at "Set up job": the Runner Image group says ubuntu-26.04 or ubuntu-24.04. A re-run can land on 24.04 and pass until November 19, so a green re-run proves nothing.

Other 26.04 failures

See failed jobs from IntelliJ IDEA

Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).

GitHub and GitHub Actions are trademarks of GitHub, Inc.; Ubuntu is a trademark of Canonical Ltd.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Canonical or JetBrains.

More: "The ubuntu-latest label will migrate to Ubuntu 26" · sudo -E on Ubuntu 26.04 · apt on Ubuntu 26.04 · GitHub Actions plugins for IntelliJ IDEA compared · 日本語