Wer mit Pipewire Musik auf einem headless-System abspielen möchte, hat ein Problem. Lest hier, wie ihr dennoch unter der Dusche mitsingen könnt.>
Es gibt Leute, die es morgens im Badezimmer gerne ruhig haben; andere singen unter der Dusche oder hören Musik beim Zähneputzen. Ich gingöre zur letzten Gruppe. Deshalb habe ich einen alten Raspberry Pi 3 in ein Badezimmerradio umfunktioniert. Der Raspi steht im Spiegelschrank und ist über den Klinkenanschluss mit einem Lautsprecher verbunden, der auf dem Spiegelschrank steht. Wenn ich morgens ins Bad gehe, schalte ich den Lautsprecher ein und geniesse die Musik zum Wachwerden.
Das Projekt Badezimmerradio habe ich in diesem und diesem Artikel im Detail beschrieben. Dort lest ihr auch, wie ich das technisch gemacht habe.
Trixie zickt
Nun, eigentlich zickt nicht Trixie (Debian 13), sondern Pipewire. Das ist die Ablösung von Pulseaudio und JACK, um endlich einen zuverlässigeren Audio-Stack unter Linux zu bekommen. Doch von Anfang an: Auf meinem Raspi 3 lief noch RaspberryOS basierend auf Debian Bullseye. Als Trixie erschien, habe ich ein Upgrade von Bullseye auf Bookworm auf Trixie versucht, was nicht funktioniert hat. Deshalb habe ich RaspberryOS in der aktuellen Version mit Trixie komplett neu installiert. Bei Trixie ist Pipewire der Standard-Multimedia-Server (vielleicht war es das schon bei Bookworm; weiß ich nicht und ist auch egal).
Beim Badradio startet ein Cronjob zu definierten Zeiten ein Shell-Skript, welches MPV zum Abspielen eines Internet-Radiosenders verwendet. Nach 2 Stunden terminiert sich das Shell-Skript und die Musikwiedergabe endet.
Das Problem
Nach der Neuinstallation des Betriebssystems habe ich den Cronjob wieder eingerichtet und das Skript drauf kopiert. Da der Raspi headless ist, bediene ich ihn über eine SSH-Verbindung von meinem Notebook aus. Dann habe ich getestet, ob das Radio spielt, indem ich das Skript von Hand gestartet habe. Es spielte und so sieht das aus:
HELP-Raum der GNU/Linux.ch-Community haben immer wieder neue Vorschläge gegeben – herzlichen Dank dafür. Es führt zu weit, wenn ich hier jeden Lösungsversuch im Detail erkläre; daher nur eine Liste:
- Pipewire durch Pulseaudio ersetzen
- Pipewire deinstallieren und auf ALSA hoffen
- Verweilen (loginctl enable-linger username)
- Autossh auf localhost
- SSH-Sitzung aufrechterhalten
- Bildschirm
- Tmux
- nohup
- verleugnen
- setid
In den Quellen findet sie Beschreibungen, was es mit den Versuchen auf sich hat. Um es vorwegzunehmen: Bis auf einen führten keine dieser Versuche zum Erfolg. Kennt ihr Ockhams Rasiermesser? Vereinfacht besagt dieses Prinzip, dass die einfachste Theorie häufig die beste ist. Ihr kennt das aus der Pizzeria, wenn ihr euch die Speisekarte anschaut. Meistens ist die erste Auswahl, die beste; minutenlanges Studieren führt in der Regel nicht zu einem besseren Genuss.
Die Lösung
Einer der ersten Lösungsvorschlääge, die ich im HELP-Raum erhalten habe, stammt von elfchen. Sein Rat war, Pipewire zu deinstallieren, um ALSA den Job machen zu lassen. Ich war skeptisch, weil Pipewire und Wireplumber tief ins Betriebssystem integriert sind. Das Internet verrät einen, dass diese Deinstallation auch die grafische Benutzeroberfläche mit in den Abgrund reißt. Das könnte mir egal sein, weil der Raspi kopflos betrieben wird. Dennoch habe ich mich zuerst auf Anpassungen an der Konfiguration konzentriert, ohne das halbe Betriebssystem einzureißen. Wie gesagt, führten diese Versuche nicht zum Erfolg.
Dann bin ich über meinen Schatten gesprungen. Zuerst habe ich diese Befehle ausgeführt, um Pipewire durch Pulseaudio zu ersetzen:
# Remove PipeWire configurations
rm -rf ~/.config/pipewire/
sudo rm -rf /etc/pipewire/
# Remove PulseAudio configurations
rm -rf ~/.config/pulse/
sudo rm -rf /etc/pulse/
# Remove Bluetooth configurations
sudo rm -rf /etc/bluetooth/
# Install PulseAudio
sudo apt install pulseaudio
# Remove Bluez
sudo apt purge bluez
# Install PulseAudio Bluetooth module
sudo apt install pulseaudio-module-bluetooth
# Disable PipeWire services
systemctl --user stop pipewire
systemctl --user stop pipewire.socket
systemctl --user stop wireplumber
systemctl --user disable pipewire
systemctl --user disable pipewire.socket
systemctl --user disable wireplumber
sudo systemctl --global disable pipewire
sudo systemctl --global disable pipewire.socket
sudo systemctl --global disable wireplumber
# Enable PulseAudio service
systemctl --user enable pulseaudio
sudo systemctl --global enable pulseaudio
# Reboot
sudo rebootDanach funktionierte die Audio-Wiedergabe über MPV immer noch. Allerdings wurde trotz der oben gezeigten Befehle, Pipewire weiterhin für die Wiedergabe verwendet. Dann hatte ich es satt und hatte die erste Pizza auf der Speisekarte bestellt:
sudo apt purge pulseaudio
sudo apt purge pipewire
sudo apt autoremove
sudo /etc/init.d/alsa-utils reset
sudo rebootÜberraschenderweise konnte ich danach über die SSH-Verbindung das Skript starten und MPV spielte über ALSA (siehe erster Screenshot). Doch die entscheidende Frage stand noch im Raum: Wird die Musik auch dann spielen, wenn kein User angemeldet ist und das Skript vom Cronjob gestartet wird?
Ihr ahnt es. Ja, alles funktionierte wieder wie gewünscht.
Herzlichen Dank an unsere Community für die Unterstützung!
Titelbild: https://pixabay.com/photos/faucet-shower-filter-shower-hand-5972471/ (modifiziert)
Quellen:
https://unix.stackexchange.com/questions/462845/how-to-apply-lingering-immediately#462867
https://www.baeldung.com/linux/ssh-keep-alive
https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/

