Frage von Rindula, 53

Linux | Screen | Wie kann ich screen ohne Terminal ausführen?

Hallo

Ich wollte über PHP einen Linux befehl ausführen. Das klappt auch soweit. Nun wollte ich damit Musik auf meinem Raspberry Pi abspielen lassen. Klappt auch soweit. Mein Problem: Die Seite lädt, solange das Lied spielt, da eine "Livewiedergabe" im Terminal angezeigt wird (SOX play Funktion). Mein Lösungsweg: Screen. Allerdings braucht das ein Terminal zum ausführen. Gibt es da ein Argument für, sodass ich kein Terminal brauche? (Unter "screen --help" hab ich nichts gefunden)

Danke für jede Hilfreiche Antwort
Rindula

Antwort
von PeterKremsner, 34

PHP kann das direkt auch machen, du musst beim exec befehl nur stdout und stderr umleiten:

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

Im Prinzip führt dieser Befehl your_command aus.

nohup bewirkt dass das Programm auch nach beenden des PHP Prozesses weiter läuft und setsid bewirkt, dass dem Process eine neue Processid zugewiesen wird, dadurch wird das Programm unabhängig von der Shell, ähnlich wie ein daemon.

> /dev/null 2>&1 & bewirkt dass sowohl stderr und stdout in /dev/null umgeleitet wird.

Du musst aber aufpassen, weil wenn du die Seite während der Wiedergabe neu ladest, dann wird das Audiofile nochmal aufgerufen, dadurch hast du zwei sich überlappende Audio Ausgaben, oder auch mehr.

Kommentar von Rindula ,

Hat leider nicht funktionert... :( Hier ist der auszuführende befehl... vllt. kannst du was damit anfangen: play "/var/www/mpd/music/'. $_POST['playmusic'] .'.mp3"

Kommentar von PeterKremsner ,

Wie genau hast du das in den exec String eingefügt?

btw mach es zum test simpel und mach mal statt der POST Variable einfach einen Pfad zu einer existierenden Audiodatei.

Teste den String also 

exec nohup setsid your_command > /dev/null 2>&1 &

, zuerst direkt auf der Commandozeile, wenn es hier funktioniert dann gib es in dein PHP Skript. Your Command ersetzt du einfach durch deinen play Befehl für eine existierende Audiodatei.

Kommentar von Rindula ,

Bei mir hat das hier funktioniert, nur die Seite lädt halt solange das Lied läuft:

exec('sudo play "/var/www/mpd/music/'. $_POST['playmusic'] .'.mp3"');
Kommentar von Rindula ,

ok... es hat funktionert... hab nur das sudo vergessen... Danke

Kommentar von PeterKremsner ,

Ok läuft die Musikwiedergabe jetzt unabhängig von der Seite?

Kommentar von Rindula ,

Einwandfrei :-)

Kommentar von Rindula ,

Und was das mit der Musikdoppelung angeht... einfach vorher das hier ausführen:

sudo killall play

Dann stoppt die musik vor der Wiedergabe eines zweiten stückes ;D

Kommentar von PeterKremsner ,

ist zwar ein bisschen "dirty" aber in dem Fall vollkommen ausreichend ;)

Kommentar von PeterKremsner ,

Habe es gerade schnell auf meinem Linux getestet, bei mir funktioniert play aber nicht mit mp3 dateien.

Ich verwende mpg123 statt play und mit dem funktioniert es einwandfrei.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten