From 6f01097558d94bc89cf8b84ad75c5578551f9c2f Mon Sep 17 00:00:00 2001 From: nexxo Date: Tue, 4 Aug 2026 09:07:50 +0200 Subject: [PATCH] =?UTF-8?q?Version=201.6.5=20=E2=80=94=20eine=20Frist=20oh?= =?UTF-8?q?ne=20Nachdruck=20ist=20keine=20Frist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Update-Agent kam seit 08:02 nicht mehr an die Arbeit. Gemessen auf dem Live-Server: ein Kind mit "timeout 45" stand nach VIER MINUTEN noch. timeout schickt nach der Frist ein SIGTERM. `docker compose exec` stirbt daran nicht, wenn es auf den Docker-Daemon wartet — und danach wartet timeout selbst unbegrenzt weiter. Der Aufruf haelt dabei die Sperre, also wurde JEDER folgende Lauf uebersprungen. Stundenlang. Beide Fristen im Agenten bekommen jetzt `-k 10`: zehn Sekunden nach dem SIGTERM folgt ein SIGKILL, den niemand ignorieren kann. Aus einem unbegrenzten Haenger wird eine Verzoegerung von 55 Sekunden. Der Kommentar an der Stelle kannte die Gefahr bereits ("timeout, weil dieser Aufruf die Sperre haelt") — die Massnahme reichte nur nicht. Die Begruendung steht jetzt mit dem Messwert dabei. Co-Authored-By: Claude Opus 5 --- VERSION | 2 +- deploy/update-agent.sh | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index 9edc58b..9f05f9f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.6.4 +1.6.5 diff --git a/deploy/update-agent.sh b/deploy/update-agent.sh index f207aa5..a7773a5 100755 --- a/deploy/update-agent.sh +++ b/deploy/update-agent.sh @@ -151,11 +151,23 @@ sync_console_allowlist() { # artisan command that logs anything as root leaves storage/logs owned by # root, after which the application cannot append to its own log — and every # page that logs answers 500 with nothing written to say why. - # `timeout`, weil dieser Aufruf die Sperre haelt: haengt der Behaelter — + # `timeout -k`, weil dieser Aufruf die Sperre haelt: haengt der Behaelter — + # + # Das `-k 10` ist am 4. August 2026 dazugekommen, nachdem ein Lauf mit + # `timeout 45` nach VIER MINUTEN noch stand. `timeout` schickt nach der + # Frist ein SIGTERM, und `docker compose exec` stirbt daran nicht, wenn + # es auf den Docker-Daemon wartet — danach wartet `timeout` selbst + # unbegrenzt. Eine Frist ohne Nachdruck ist keine Frist, sondern eine + # Bitte. Mit `-k 10` folgt zehn Sekunden spaeter ein SIGKILL, den + # niemand ignorieren kann. + # + # Das war der Ausfall, den die Konsole als "kommt seit 08:02 nicht an die + # Arbeit" gemeldet hat: ein einziger haengender Aufruf, der die Sperre + # stundenlang hielt, waehrend jeder folgende Lauf uebersprungen wurde. # gerade neu gestartet, ueberlastet, halb tot —, haengt der Agent mit, und # jeder folgende Takt steigt still aus. Lieber diese Runde ohne Allowlist # als eine Konsole, die minutenlang nichts mehr von sich hoert. - generated="$(timeout 45 docker compose exec -T -u www-data app php artisan clupilot:console-access caddy 2>/dev/null)" || return 0 + generated="$(timeout -k 10 45 docker compose exec -T -u www-data app php artisan clupilot:console-access caddy 2>/dev/null)" || return 0 # Never write an empty matcher: in Caddy that matches nothing, and the # console would be unreachable from everywhere including the shell. grep -q '@allowed remote_ip .' <<<"$generated" || return 0 @@ -308,7 +320,7 @@ DEPLOYED_VERSION="$(release_manifest_version)" # vielen Minuten aufgibt — und haelt dabei die Sperre. Zwei Minuten sind # grosszuegig fuer einen fetch gegen EINE Gegenstelle; laenger ist kein # langsames Netz mehr, sondern eines, das nicht antwortet. -if timeout 120 git fetch --quiet --tags --force origin 2>/dev/null; then +if timeout -k 10 120 git fetch --quiet --tags --force origin 2>/dev/null; then # Newest by version order, not by tag date. Through the helper rather than # `| head -1`: head exits after one line, git takes SIGPIPE, and pipefail # ends the agent — see release_newest_tag.