exec/system killall vlc funktioniert nicht

Alles, was PHP betrifft, kann hier besprochen werden.

exec/system killall vlc funktioniert nicht

Postby Thoma » 03. May 2014 06:04

Hallo,

wenn ich versuche das Programm vlc per killall zu beenden, dann funktioniert dies leider nicht. Als Antwort erhalte ich eine 1. Andere Befehle z. B. ls werden korrekt ausgeführt.

Ich habe dann eine Batchdatei erstellt, die das killen übernimmt. Wenn ich die Datei im Terminal aufrufe, dann klappt alles. Per system() oder exec() geht es wieder nicht.

Was muss ich ändern, damit das beenden klappt?

Gruß Thoma
Thoma
 
Posts: 4
Joined: 01. May 2014 07:56
Operating System: Xubuntu

Re: exec/system killall vlc funktioniert nicht

Postby Nobbie » 03. May 2014 12:09

Ohne Sourcecode muss ich wild raten. Ich würde vermuten, dass Du "killall" ohne vollständigen Pfad aufrufst, sondern "nackt". Dann hängt es von der PATH-Variable des ausführenden Users ab, ob es überhaupt gefunden wird oder nicht. Apache wird von einem anderen User ausgeführt als ein Terminal.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: exec/system killall vlc funktioniert nicht

Postby Thoma » 04. May 2014 06:07

Hallo,

ja ich habe killall ohne Pfad aufgerufen, aber auch mit Pfad ändert sich nichts.
Code: Select all
exec('/usr/bin/killall vlc');

liefert einfach ein leeres Array zurück. Ich kann leider nicht erkennen, warum killall nicht ausgeführt wird.

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.

Gruß Thoma
Thoma
 
Posts: 4
Joined: 01. May 2014 07:56
Operating System: Xubuntu

Re: exec/system killall vlc funktioniert nicht

Postby Nobbie » 04. May 2014 12:58

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.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04


Return to PHP

Who is online

Users browsing this forum: No registered users and 72 guests

cron