Thoma wrote:liefert einfach ein leeres Array zurück. Ich kann leider nicht erkennen, warum killall nicht ausgeführt wird.
Weil es ihn vielleicht gar nicht gibt? Oder der Apache User darf diesen Prozess nicht beenden (meistens dürfen nur eigene Prozesse beendet werden)?
Thoma wrote:Der Befehl:
- Code: Select all
exec('usr/bin/vlc');
liefert diese Meldungen zurück:
Array
(
[0] => VLC media player 2.1.2 Rincewind
[1] => Command Line Interface initialized. Type `help' for help.
[2] => > Shutting down.
)
Das ist mein nächstes Problem. Ich muss vlc beenden, aber auch wieder starten können.
Unabhängig davon, dass oben der erste Slash fehlt (/usr/bin/vlc und nicht usr/bin/vlc) geht das auch so nicht, exec() (und auch die anderen system()-Varianten) warten ab, bis ein Prozess beendet wird. Das Script würde hängen bleiben, wenn exec() auf VLC wartet. Um einen Prozess zu starten, auf den nicht gewartet wird und der dennoch nicht beendet wird, muss man:
a) diesen Prozess im Hintergrund starten (unter Linux geschieht das durch anfügen des "&" Zeichens an die Befehlszeile, also beispielsweise so:
- Code: Select all
exec('/usr/bin/vlc &');
b) außerdem darf der gestartete Prozess keine Ausgabe auf Standard-Out (und Standard-Error) produzieren, das erreicht man durch Umleiten der Ausgabe via ">" auf /dev/null, vollständig sieht das so aus:
- Code: Select all
exec('usr/bin/vlc >/dev/null 2>&1 &');
c) und außerdem muss das Script mit "nohup" gestartet werden, da es sonst spätestens dann beendet wird, wenn der Startprozess (das PHP Script oder auch Apache, je nachdem wie Apache/PHP installiert ist) beendet wird, auch das ist ja nicht gewünscht. Dazu muss das Script über die Shell mit dem Kommando "nohup" (= no hangup) gestartet werden. Und wenn man ganz auf Nummer sicher gehen will, startet man das Script zusätzlich via "setsid", um es in einer eigenen Session zu starten. Und dann schaltet man außerdem "exec" (als Shellcommand) dazwischen, um nicht unnötig viele Shell zu starten. Zum Schluss sieht das ganze dann so aus:
- Code: Select all
exec('bash -c "exec nohup setsid /usr/bin/vlc >/dev/null 2>&1 &"');
Bevor Du das jetzt ausprobierst, eine grundsätzliche Anmerkung: mir erscheint das, was Du da versuchst, falsch umgesetzt zu sein. Was auch immer es ist, es sieht so aus, als wenn Du VLC als Streamer auf dem Server einsetzen willst. Wenn das so ist, dann ist das der falsche Ansatz dazu. Richtig wäre, VLC als Dienst (od. Service oder Daemon - das ist alles das gleiche, nur unter anderem Namen) zu installieren und anzusteuern, das ist explizit eine Eigenschaft von VLC, dass man ihn als Dienst benutzt um mediale Daten zu streamen.