Forum: PC-Programmierung php Programme ausführen funktioniert nicht


von andy1983 (Gast)


Lesenswert?

Hallo zusammen,
ich hab mir folgendes php Skript angelegt:

<?php
shell_exec("killall ffmpeg &");
sleep (4);
shell_exec("Xvfb :99 &");
sleep (4);
shell_exec("export DISPLAY=:99");
sleep (4);
shell_exec("su -c 'DISPLAY=:99 chromium 
https://studio.youtube.com/channel/meinphpkanal/livestreaming'; - andreas 
&");
sleep (120);
shell_exec("ffmpeg -f lavfi -i anullsrc -rtsp_transport tcp -i 
rtsp://benutzername:passwort@192.168.2.5:554/ch2/2 -tune zerolatency 
-vcodec libx264 -pix_fmt + -c:v copy -c:a aac -strict experimental -f 
flv rtmp://a.rtmp.youtube.com/live2/youtube.key -nostdin -nostats &");
sleep (120);
shell_exec("killall Xvfb &");

?>

1) ffmpeg soll beendet werden
2) virtuelle Grafikkarte soll gestartet werden.
3) chromium soll in der virtuellen Grafikkarte gestartet werden.
Als root geht es nicht, daher als der User andreas
4) ffmpeg baut eine Verbindung zu youtube auf
5) Die virtuelle Grafikkarte soll wieder beendet werden.

ps -ax ergibt:
 1221 pts/0    S      0:00 php test.php
 1226 pts/0    Z      0:00 [sh] <defunct>
 1227 pts/0    S      0:00 Xvfb :99

[sh] <defunct>

Wenn ich die Befehle als Bashskript ausführe, funktioniert es zu 100%, 
weshalb aber nicht in php?

von Sandfrog (Gast)


Lesenswert?

Brrr warum muss das in PHP sein ?

1. Dir fehlt oben eine Zeile #!/.../php
2. Ausführungszeit ist über 30sec (Default Einstellungen vom PHP)
2. Wenn ich mich recht erinnre kann Shell_exec nur einen Parameter für 
mehr muss man noch etwas mehr machen.

von Εrnst B. (ernst)


Lesenswert?

Sandfrog schrieb:
> Brrr warum muss das in PHP sein

+1.

Schreib das ganze als ein (1) Shellscript. Wenn dann PHP dazu muss, 
ruf aus PHP heraus das eine Script auf.

Sowas
> shell_exec("export DISPLAY=:99");

geht in PHP nicht. Hast ja schon gemerkt...
PHP startet eine shell, die shell setzt eine Variable, die Shell beendet 
sich wieder, die Variable verschwindet im Nirvana, PHP führt die nächste 
Anweisung aus...
Also:
1
#!/bin/bash
2
killall ffmpeg  # Kein '&' dahinter. Das Script soll erst weiterlaufen, wenn der killall-Befehl ausgeführt wurde.
3
export DISPLAY=:99
4
Xvfb $DISPLAY &
5
sleep 4
6
chromium .... & # evtl. über phantomjs o.Ä. nachdenken.
7
...

: Bearbeitet durch User
von andy1983 (Gast)


Lesenswert?

Hallo,
danke für die Informationen.
Hab das php Programm jetzt in basic programmiert, dass dann das bash 
startskript ausführt.
Nun müsste es gehen...Nochmal danke

von quotendepp (Gast)


Lesenswert?

andy1983 schrieb:
> php Programm jetzt in basic programmiert, dass dann das bash startskript

ähm, darf man fragen wozu? starte das bashscript doch einfach direkt und 
spar dir den umweg...

von Purzel H. (hacky)


Lesenswert?

Allenfalls einen Webserver kapern ?

von Le X. (lex_91)


Lesenswert?

quotendepp schrieb:
> ähm, darf man fragen wozu? starte das bashscript doch einfach direkt und
> spar dir den umweg...

Die Wahl von php liegt evtl. in dem Teil des Codes begründet den er 
nicht zeigt.
Möglicherweise hat er irgendwo einen Server laufen und sendet diesem 
Kommandos (per http POST, TCP/IP oder whatever) und will dadurch 
Aktionen, z.B. das Abspielen eines Videos triggern.

Witzigerweise habe ich sowas vor 2 Wochen auch mal gemacht.
Hab es komplett in Python umgesetzt.
Das Socket-Handling und Parsen der Kommandos könnte man natürlich auch 
in reinem bash machen, ich könnte mir aber auch nen rostigen Nagel ins 
Knie hauen.

: Bearbeitet durch User
von andy1983 (Gast)


Lesenswert?

Hallo,
es ging um das Anlegen eines youtube Livestream, das automatisiert 
werden sollte, daher folgender Ablauf:

1) Prüfen ob der Livestream vorhanden ist
2) Prüfen ob eine Internetverbindung vorhanden ist

Ist kein Livestream mehr vorhanden, aber die Internetverbindung ist 
nicht oder nicht mehr unterbrochen, macht es dann folgendes im bash 
Skript:

3) ffmpeg beenden, falls es noch läuft
4) virtuelle Grafikkarte starten
5) chrome in der virtuellen Grafikkarte starten mit der Startseite, wo 
man einen youtube Livestream anlegt.
6) 120 Sek warten
7) ffmpeg starten, der den rtsp Stream der Kamera an youtube schickt.
8) Die virtuelle Grafikkarte beenden, was auch chrome beendet.

Nun wird das bash skript beendet und mein basic Programm prüft wieder 
1+2.
Wird der livestream beendet, oder die Internetverbindung ist weg, wird 
wieder das bash Skript ausgeführt.

Das ganze funktioniert jetzt sehr stabil.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.