Im Betrieb aufgetreten: Beim Sprung von 1.5.0 auf 1.10.1 endete scripts/update.sh mitten in der Ausgabe — kein Fehler, keine Zeile, zurück zur Eingabeaufforderung.
Ursache
git log --oneline "HEAD..$ZIEL"| head -15 | sed ...
head schließt die Leitung nach 15 Zeilen, git log schreibt weiter und bekommt SIGPIPE (141). Mit set -o pipefail gilt die ganze Kette als gescheitert, set -e beendet das Skript — stumm. Nachgestellt und mit Exitcode 141 belegt.
Zeitabhängig, deshalb monatelang unauffällig: Solange git log fertig war, bevor head zumachte, ging es gut. Die Schwelle liegt exakt bei 15 Commits — und v1.5.0..v1.10.0 waren die ersten 16.
Dieselbe Falle in der Sicherung, mit schlimmeren Folgen
sicherung.sh prüfte mit openssl … | head -c 5 | grep -q "PGDMP", ob sich die frische Sicherung wieder entschlüsseln lässt. Beide Leser schließen früh. Bei kleiner Datenbank steht alles im Puffer; mit wachsender Datenbank kippt es — und dann meldet das Skript eine intakte Sicherung als kaputt und verweigert das Update. Jetzt liest dd eine feste Menge und endet regulär.
Damit es nicht wieder stumm passiert
Eine ERR-Falle nennt Zeilennummer und Exitcode und erklärt bei 141 ausdrücklich, dass es SIGPIPE ist — ein Fehler im Skript, nicht beim Benutzer.
Ein Test verbietet | head in Skripten mit pipefail und nennt die Zeile. Gegenprobe gemacht: Er schlägt an.
Bei mehr als 15 Commits steht „… und N weitere" darunter, statt sie wortlos wegzulassen.
Geprüft: Ablauf von 1.5.0 auf 1.10.1 nachgestellt — läuft durch. 658 Unit-Tests, Typecheck und Lint sauber.
Version 1.10.2.
Im Betrieb aufgetreten: Beim Sprung von 1.5.0 auf 1.10.1 endete `scripts/update.sh` mitten in der Ausgabe — kein Fehler, keine Zeile, zurück zur Eingabeaufforderung.
**Ursache**
```bash
git log --oneline "HEAD..$ZIEL" | head -15 | sed ...
```
`head` schließt die Leitung nach 15 Zeilen, `git log` schreibt weiter und bekommt SIGPIPE (141). Mit `set -o pipefail` gilt die ganze Kette als gescheitert, `set -e` beendet das Skript — stumm. Nachgestellt und mit Exitcode 141 belegt.
Zeitabhängig, deshalb monatelang unauffällig: Solange `git log` fertig war, bevor `head` zumachte, ging es gut. Die Schwelle liegt exakt bei 15 Commits — und `v1.5.0..v1.10.0` waren die ersten **16**.
**Dieselbe Falle in der Sicherung, mit schlimmeren Folgen**
`sicherung.sh` prüfte mit `openssl … | head -c 5 | grep -q "PGDMP"`, ob sich die frische Sicherung wieder entschlüsseln lässt. Beide Leser schließen früh. Bei kleiner Datenbank steht alles im Puffer; mit wachsender Datenbank kippt es — und dann meldet das Skript eine **intakte Sicherung als kaputt** und verweigert das Update. Jetzt liest `dd` eine feste Menge und endet regulär.
**Damit es nicht wieder stumm passiert**
- Eine `ERR`-Falle nennt Zeilennummer und Exitcode und erklärt bei 141 ausdrücklich, dass es SIGPIPE ist — ein Fehler im Skript, nicht beim Benutzer.
- Ein Test verbietet `| head` in Skripten mit `pipefail` und nennt die Zeile. **Gegenprobe gemacht:** Er schlägt an.
- Bei mehr als 15 Commits steht „… und N weitere" darunter, statt sie wortlos wegzulassen.
**Geprüft:** Ablauf von 1.5.0 auf 1.10.1 nachgestellt — läuft durch. 658 Unit-Tests, Typecheck und Lint sauber.
Version 1.10.2.
Beim Sprung von 1.5.0 auf 1.10.1 endete scripts/update.sh mitten in der
Ausgabe. Kein Fehler, keine Zeile, einfach zurueck zur
Eingabeaufforderung.
Ursache war eine abgeschnittene Leitung:
git log --oneline "HEAD..$ZIEL" | head -15 | sed ...
head schliesst die Leitung nach 15 Zeilen, git log schreibt weiter und
bekommt SIGPIPE (141). Mit "set -o pipefail" gilt die ganze Kette als
gescheitert, "set -e" beendet das Skript - stumm.
Zeitabhaengig, deshalb monatelang unauffaellig: Solange git log fertig
wurde, bevor head zumachte, ging es gut. Die Schwelle liegt exakt bei
15 Commits, und v1.5.0..v1.10.0 waren die ersten 16.
Behoben, indem der Erzeuger selbst begrenzt (git log -15) statt die
Leitung zu kappen. Dieselbe Behandlung fuer die beiden Tag-Listen.
Dieselbe Falle steckte in der Selbstpruefung von sicherung.sh:
openssl enc -d ... | head -c 5 | grep -q "PGDMP"
Beide Leser schliessen frueh. Bei kleiner Datenbank steht alles im
Puffer und es faellt nicht auf; mit wachsender Datenbank kippt es - und
dann meldet das Skript eine INTAKTE Sicherung als kaputt und verweigert
das Update. Jetzt liest dd eine feste Menge und endet regulaer.
Damit so etwas nicht wieder stumm passiert:
- Eine ERR-Falle nennt Zeilennummer und Exitcode und erklaert bei 141,
dass es SIGPIPE ist und ein Fehler im Skript, nicht beim Benutzer.
- Ein Test verbietet "| head" in Skripten mit pipefail und nennt die
Zeile. Gegenprobe gemacht: Er schlaegt an.
- Bei mehr als 15 Commits steht "... und N weitere" darunter, statt sie
wortlos wegzulassen.
Nachgestellt: der Ablauf von 1.5.0 auf 1.10.1 laeuft durch.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Im Betrieb aufgetreten: Beim Sprung von 1.5.0 auf 1.10.1 endete
scripts/update.shmitten in der Ausgabe — kein Fehler, keine Zeile, zurück zur Eingabeaufforderung.Ursache
headschließt die Leitung nach 15 Zeilen,git logschreibt weiter und bekommt SIGPIPE (141). Mitset -o pipefailgilt die ganze Kette als gescheitert,set -ebeendet das Skript — stumm. Nachgestellt und mit Exitcode 141 belegt.Zeitabhängig, deshalb monatelang unauffällig: Solange
git logfertig war, bevorheadzumachte, ging es gut. Die Schwelle liegt exakt bei 15 Commits — undv1.5.0..v1.10.0waren die ersten 16.Dieselbe Falle in der Sicherung, mit schlimmeren Folgen
sicherung.shprüfte mitopenssl … | head -c 5 | grep -q "PGDMP", ob sich die frische Sicherung wieder entschlüsseln lässt. Beide Leser schließen früh. Bei kleiner Datenbank steht alles im Puffer; mit wachsender Datenbank kippt es — und dann meldet das Skript eine intakte Sicherung als kaputt und verweigert das Update. Jetzt liestddeine feste Menge und endet regulär.Damit es nicht wieder stumm passiert
ERR-Falle nennt Zeilennummer und Exitcode und erklärt bei 141 ausdrücklich, dass es SIGPIPE ist — ein Fehler im Skript, nicht beim Benutzer.| headin Skripten mitpipefailund nennt die Zeile. Gegenprobe gemacht: Er schlägt an.Geprüft: Ablauf von 1.5.0 auf 1.10.1 nachgestellt — läuft durch. 658 Unit-Tests, Typecheck und Lint sauber.
Version 1.10.2.