radio: martwy PulseAudio nie zabija już całego radia #23
Reference in New Issue
Block a user
Delete Branch "radio-pulse-resilience"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Łańcuch z loga
Daemon startup failed(pulse) →Connection refusednainput.pulseaudio_0/buffer.consumer_0/pulse_out→Shutdown started!→ restart → i tak w kółko.Dlaczego pętla się sama napędza
/runjest częścią zapisywalnej warstwy kontenera, arestart: unless-stoppedrestartuje ten sam kontener — więc/run/pulse/pidpo ubitym demonie przeżywa restart, kolejny start PA odbija się o „już działam", i mamy samo-podtrzymującą się pętlę. Entrypoint czyści teraz nieaktualny pid/socket tylko gdy żaden proces pulseaudio faktycznie nie żyje.Zmiany
output.pulseaudio(fallible=true, radio)— monitor lokalny może paść bez wywalania zegara i całego radia.RADIO_FORCE_SCRIPT=1— re-seedujeradio_conjurer.liqz obrazu (stary ląduje jako.bak).Ważne: skrypt w kontenerze jest STARY
Entrypoint celowo nigdy nie nadpisuje
$DATA/radio_conjurer.liq(ręczne edycje wygrywają) — ale to znaczy też, że poprawki z obrazu nigdy nie docierały do wolumenu zaseedowanego dawno temu. Dowód z loga:Nonexistent file or ill-formed URI "/srv/betoniarka/musicjingiel4.mp3"— tej ścieżki nie ma w repo, więc działający kontener ma inną, ręcznie edytowaną wersję. StądRADIO_FORCE_SCRIPT.Czego NIE zmieniam
input.pulseaudio()(mikrofon) zostaje twardą zależnością — usunięcie go zmienia zachowanie audio (micwchodzi wadd/switchzlive_enableddomyślnie true), a nie mam tu runtime'u liquidsoap, żeby to zweryfikować. Opisane komentarzem w skrypcie; dla kontenera headless właściwa konfiguracja to zakomentować oba tory pulse.🤖 Generated with Claude Code