PHP exec funktioniert nicht
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
apache
code
datei
fehler
fehlermeldung
funktion
information
inhalt
konsole
machen
nutzer
ordner
problem
programm
quelle
schnellsten wege
server
signatur
starten
url
-
Hallo,
ich habe ein Problem: ich möchte aus einem PHP-Skript eine ausführbares Programm nur starten (!) und nicht darauf warten, dass es fertig wird / sich beendet. Dazu hatte ich den folgenden Code:
<?php exec(sprintf("%s > %s 2>&1 & echo $! >> %s", './executable', 'outputfile.txt', 'pidfile.txt')); ?>
Die beiden Dateien outputfile.txt und pidfile.txt werden angelegt und mit Inhalt gefüllt. Die Datei outputfile.txt hat den Inhalt:
sh: ./executable: Permission denied
Somit wird das Executable nicht gestartet. Dieser Fehler ist mir unerklärlich, da das gesamte Verzeichnis und die Dateien einzeln, per chmod auf 777 gesetzt wurden (zum Test), damit es garantiert funktioniert (wie ich dachte), tut es aber nicht.
Ich würde mich über eine Lösung wirklich freuen.
otisoft -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Die Funktion exec ist auf sehr vielen Hosts, wie auch hier, verboten. Du hast einfach nicht die Rechte diese Funktion auszuführen.
Das hast du aber auf kaum einem Host, und erst recht auf keinem Freehost. Um ein externes Programm auszuführen wirst du wohl auch einen eigenen Server anmieten müssen, oder eine andere Lösung finden müssen.
Liebe Grüße -
Das gepostete Skript funktioniert bei mir fehlerfrei.
Wenn ich "exec" in der php.ini bei disable_functions eintrage, dann kommt dieser Fehler:
Auch bei Lima-City kommt genau diese Fehlermeldung. Dies ist aber bei dir offensichtlich nicht das Problem.Warning: exec() has been disabled for security reasons
Jetzt beginnen die Spekulationen ...
Informationen über die Umgebung sind da mal angebracht. Also hast du den Server bei dir privat aufgesetzt oder hostest du die Seite irgendwo / wenn ja, wo?
Dann könntest du noch zwei Dinge versuchen:
1. Kannst du ein anderes Programm (z.B. "ls") ausführen?
<?php exec(sprintf("ls -l > %s 2>&1 & echo $! >> %s", 'outputfile.txt', 'pidfile.txt')); ?>
Sollte das klappen, schau die Ausgabe noch einmal genau an oder zeige sie uns. Denn dass mit den Dateirechten etwas nicht stimmt, ist sehr naheliegend, auch wenn du versicherst, sie auf 777 gesetzt zu haben.
2. Hast du Zugriff auf eine Shell, dann versuch mal, diesen Shellbefehl direkt auszuführen. Also:
./executable > outputfile.txt 2>&1 & echo $! >> pidfile.txt
Vielleicht kommen wir mit diesen Ergebnissen dem Fehler näher. -
autobert schrieb:
Hosted by lima-city of course!
Würde natürlich die Fehlermeldung erklären.
Quelle: Signatur des TE's
Nein, ich habe das Angesprochene nicht hier gehosted. Auf dem Server, auf dem es gehosted ist, ist exec erlaubt!
----
Es funktioniert jetzt das Programm zu starten, aber das Programm hat trotz 3fach überprüften Rechten angeblich keine Rechte eine Datei in dieses Verzeichnis zu schreiben. Auf der Konsole funktioniert es, über den Browser nicht.
Beitrag zuletzt geändert: 16.7.2016 15:17:35 von otisoft -
Und du führst das Script über die Konsole mit dem selben Nutzer aus unter dem auch der Webserver rennt?
-
Nein, der User auf der Konsole ist mein User und der im PHP ist "apache". Allerdings funktioniert das Ändern mit "chown" auf rätselhafte Weise einfach nicht. Es wird zwar "Eigentümer geändert" zurückgegeben, es passiert aber nichts!
-
Um zu prüfen, ob der apache Nutzer die Rechte hat kannst du einfach mal
eingeben. Falls des runuser nicht existiert kannst du auchrunuser -l apache -c "./executable"
benutzen.su - apache -c "./executable"
Dann weißt du, ob es an den Userberechtigungen liegt.
Was macht denn dein executable? Vielleicht macht das ja auch etwas, wo die Rechte für fehlen, und das ist der einzige Output wegen einem Crash? -
Runuser existiert, gibt aber zurück "runuser: cannot set groups".
Das Executable soll eine Datei von einem anderen Server herunterladen, diese entpacken und in Stücke teilen. Der Fehler tritt beim Zwischenspiechern des Downloads auf. -
Hi,
Mit diesem Anliegen solltest du lieber in ein Linux-Forum gehen wie debianforum.de, da kann und wird dir auf dem schnellsten Wege geholfen.
Den Eigentümer der Datei zu ändern reicht nicht aus. Der Ordner muss ebenfals für den Apache-User sichtbar sein. Sprich "chown" für den kompletten Ordnerpfad bzw. "chmod 755" Damit jeder auf den Ordnerpfad lesen kann.
Wenn dein Script nun etwas zwischenspeichert, dann brauch Apache auch Schreibrechte im Ordner.
Wenn du den Ordnerpfad per "chown" an Apache gegeben hast, dann kann er auch schreiben, wenn nicht kannst du das mit "chmod 777" ändern.
Wenn das nicht helfen sollte, dann brauchen wir hier einfach mal ein paar mehr Informationen über dein Linux-System und Installation.
MFG Micha -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage