PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit exec() - Programm auf Server ausführen



preg
19-02-2005, 18:51
Hallo,
Ich möchte über eine PHP Datei ein Programm auf dem Server starten.
Dazu nutze ich diesen Code:

exec('cd /home/www/webs/html/sys && nohup java -mx64 ChatClass &>/dev/null &');

Schreibe ich dieses Kommando so wie es ist in die Konsole funktioniert es. Mit system() nicht. Das Programm wird nicht gestartet. Ich habe es auch schon mit system() probiert - das selbe in grün. Auch die Kommandos in eine Datei zu packen und diese dann mit system() aufzurufen bringen das selbe Ergebnis, obwohl auch das in der Konsole klappt. Rechtemäßig sollte es keine Probleme geben. CHMOD 777 hab ich gesetzt, aber dennoch funzt es nicht.
Habt ihr evtl. einen Lösungsansatz?

Danke und Gruß

Romanday
19-02-2005, 19:20
Hallo,
Ich möchte über eine PHP Datei ein Programm auf dem Server starten.
Dazu nutze ich diesen Code:

exec('cd /home/www/webs/html/sys && nohup java -mx64 ChatClass &>/dev/null &');

Probleme geben. CHMOD 777 hab ich gesetzt, aber dennoch funzt es nicht.
Habt ihr evtl. einen Lösungsansatz?


Dann hat der Admin des WWW Servers dies nicht erlaubt. Da hast Du
also normaler User keine Chance, außer Du kannst als Admin die
Apache config Datei selber anpassen.

Wie heißt den der Provider?

preg
19-02-2005, 19:25
Ich hab meinen eigenen Server, anpassen wäre also kein Problem.
Was müsste in der httpd.conf denn angepasst werden? Ich denke nicht, dass exec() gesperrt ist, da ein einfaches "ls" auch ausgeführt und angezeigt wird. Nur mit o.g. hat er Probleme.
Ideen?

Romanday
19-02-2005, 20:14
Ich hab meinen eigenen Server, anpassen wäre also kein Problem.
Was müsste in der httpd.conf denn angepasst werden? Ich denke nicht, dass exec() gesperrt ist, da ein einfaches "ls" auch ausgeführt und angezeigt wird. Nur mit o.g. hat er Probleme.
Ideen?

Hast du es mal mit richtigen Anführungsstrichen versucht?

exec("cd /home/www/webs/html/sys && nohup java -mx64 ChatClass &>/dev/null &");

nimmt er

system("ls");

an?

Pingu
19-02-2005, 20:23
Hi,

wenn Du mal kurz im Manual nachschaust (http://de2.php.net/exec), wirst Du feststellen, daß exec() (http://de2.php.net/manual/de/function.exec.php) einfach ein Programm ausführt, wohingegen shell_exec() (http://www.php.net/shell-exec) ein Kommando über die Shell aufruft. Ein Kommando wie cd ist ein Shell-Kommando.
Was Du aber scheinbar machen möchtest, ist, einfach ein Programm aus einem bestimmten Pfad heraus aufzurufen, dies ganz ohne Shell. Da gibt es kein cd, weil Du Dich prinzipiell erst einmal in gar keinem Verzeichnis befindest. Außerdem kannst Du nicht davon ausgehen, daß eine Pfadvariable existiert. Deswegen immer absolute Pfade zu den Programmen angeben. Also müßte der Aufruf folgendermaßen lauten:

exec('/usr/bin/nohup /usr/bin/java -mx64 /pfad/zur/klasse/ChatClass > /dev/null');


Auch die Kommandos in eine Datei zu packen und diese dann mit system() aufzurufen bringen das selbe Ergebnis, obwohl auch das in der Konsole klappt.

Wie hast Du die Kommandos in eine Datei gepackt? Als Skript? Denn richtig wäre es dann so:


#!/bin/sh

/usr/bin/nohup /usr/bin/java -mx64 /pfad/zur/klasse/ChatClass > /dev/null &


Pingu

preg
20-02-2005, 11:41
Ok Pingu, das war das größte Problem, danke. Ich hätte nicht gedacht, dass man auch den anderen Ausführungen einen vollen Pfad verpassen muss.
wohingegen shell_exec() ein Kommando über die Shell aufruft. Ein Kommando wie cd ist ein Shell-Kommando.Also nutze ich shell_exec, da ich unbedingt vor dem ausführen in das Verzeichnis wechseln muss, da sonst die ganzen internen Links des Chats einen Fehler aufrufen und das Prog nicht gestartet werden kann. Also nutze ich dieses:
shell_exec('cd /home/www/webs/html/sys && /usr/bin/nohup /usr/local/bin/java -Xmx64 -cp /home/www/webs/html/sys ChatClass 1>/home/www/webs/html/sys/log.txt 2>&1 &');Über die Konsole eingegeben, kein Problem.. In der log.txt steht, dass er gestartet wurde.
Über die Datei kommt er nicht soweit. Wenn ich das Programm aufrufe kommt normalerweise ein "Starte..." und wenn alles läuft ein "Gestartet..."
Gebe ich also o.g. Befehl in die Konsole ein, steht in der log.txt "Starte..." und danach "Gestartet..." und das Programm läuft. Über die Datei kommt nur ein "Starte..." aber er startet nicht.
Kann es sein, dass der Befehl irgendwie abgebrochen wird, sobald ich in dem Fenster was andres anklick, wo ich das Programm starte?
*mit der Hoffnung für einen letzten helfenden Tipp*

Danke

Romanday
20-02-2005, 18:58
kann. Also nutze ich dieses:
shell_exec('cd /home/www/webs/html/sys && /usr/bin/nohup /usr/local/bin/java -Xmx64 -cp /home/www/webs/html/sys ChatClass 1>/home/www/webs/html/sys/log.txt 2>&1 &');
*mit der Hoffnung für einen letzten helfenden Tipp*
Danke


Versuch mal:


nohup cd /home/www/webs/html/sys/; /usr/local/bin/java -Xmx64 -cp /home/www/webs/html/sys ChatClass 1>/home/www/webs/html/sys/log.txt 2>&1 &

preg
20-02-2005, 19:19
Hallo Romanday,

leider bringt das auch nicht das gewünschte Ergebnis. Scheinbar wird dann nicht mehr in das Verzeichnis gewechselt, da die typischen "File not Found - java.lang.." Fehler kommen.
Evtl. noch eine Idee?

Danke :(

Romanday
21-02-2005, 08:33
Hallo Romanday,

leider bringt das auch nicht das gewünschte Ergebnis. Scheinbar wird dann nicht mehr in das Verzeichnis gewechselt, da die typischen "File not Found - java.lang.." Fehler kommen.
Evtl. noch eine Idee?

Danke :(

Programm in eine Datei schreiben z. test.sh



#!/bin/bash
# Programmname: test.sh
dir=$(pwd)
echo ''aktuelles Verzeichnis: " $dir
path='/home/www/webs/html/sys/'
cd $path;
echo ''aktuelles Verzeichnis: " $dir
/usr/local/bin/java -Xmx64 -cp ${path}ChatClass 1>${path}log.txt;
echo 'Programm hat funktioniert!';


danach

chmod u+x test.sh # auf der Konsole

Die nohup, Hintergrundgeschichte und Kanalumleitung kannst du immer noch einbauen.
Erst mal versuchen ob es überhaupt klappt.

danach Programm starten mit
<?php
$output = shell_exec('/home/www/webs/html/mein_pfad/test.sh');
echo "<pre>$output</pre>";
?>

auch mal das Programm mit exec und (o.) system() starten, und prüfen
ob das funktioniert.

Sollte das immer noch nicht klappen, Programm so aufrufen:

<?php
$output = shell_exec('. /home/www/webs/html/mein_pfad/test.sh');
echo "<pre>$output</pre>";
?>

preg
21-02-2005, 09:56
Hallo Romanday,

auch hier wechselt er das Verzeichnis nicht. Die Ausgabe von $output lautet:
aktuelles Verzeichnis: /home/www/webs/html/forum/admin
path='/home/www/webs/html/sys/'
cd ;
echo ''aktuelles Verzeichnis: /home/www/webs/html/forum/admin

*edit* Ok, wenn ich path= vor das erste echo stell, nimmt er den Pfad an - er wechselt dennoch nicht.

*edit2* Wenn ich cd.. direkt in die PHP Datei schreibe wechselt er das Verzeichnis und führt das Skript auch aus.
Allerdings wird der Chat dennoch nicht gestartet. Über die Konsole ja -> Datei: nein.
Zum Haareraufen. Starte ich den Chat über die Konsole und klicke danach bei meiner Datei auf "Start" sagt er mir, dass das Teil bereits läuft :confused:
Aber selbst starten kann/will/macht er nicht...

Trotzdem Danke an die, die sich die Mühe gemacht haben.

Romanday
21-02-2005, 11:48
Hallo Romanday

*edit2* Wenn ich cd.. direkt in die PHP Datei schreibe wechselt er das Verzeichnis und führt das Skript auch aus.
Allerdings wird der Chat dennoch nicht gestartet. Über die Konsole ja -> Datei: nein.
Zum Haareraufen. Starte ich den Chat über die Konsole und klicke danach bei meiner Datei auf "Start" sagt er mir, dass das Teil bereits läuft :confused:
Aber selbst starten kann/will/macht er nicht...

Trotzdem Danke an die, die sich die Mühe gemacht haben.

Versuch mal ->


#!/bin/bash
# Programmname: test.sh
dir=$(pwd)
echo ''aktuelles Verzeichnis: " $dir
path='/home/www/webs/html/sys/'
. cd $path; # <- Punkt davor setzen
echo ''aktuelles Verzeichnis: " $dir
/usr/local/bin/java -Xmx64 -cp ${path}ChatClass 1>${path}log.txt;
echo 'Programm hat funktioniert!';


hoffentlich wechselt das Ding jetzt das Verzeichnis.
Irgendwie muß das klappen.

preg
21-02-2005, 12:20
Ich hab es jetzt anders gelöst.
Ich habe eine Datei erstellt, die eigentlich das selbe macht wie deine sh.
Diese nach /etc/init.d kopiert und ist mit service chat start aufrufbar.
Nun kann ich per sudo service chat start den Chat starten - 3 Tage Kopf zerbrechen, aber nun klappt es.
Noch einmal Danke.

Romanday
21-02-2005, 15:04
Ich hab es jetzt anders gelöst.
Ich habe eine Datei erstellt, die eigentlich das selbe macht wie deine sh.
Diese nach /etc/init.d kopiert und ist mit service chat start aufrufbar.
Nun kann ich per sudo service chat start den Chat starten - 3 Tage Kopf zerbrechen, aber nun klappt es.
Noch einmal Danke.



#!/bin/bash
# Programmname: test.sh
dir=$(pwd)
echo ''aktuelles Verzeichnis: " $dir
path='/home/www/webs/html/sys/'
. cd $path;
dir=$(pwd)
echo ''aktuelles Verzeichnis: " $dir
/usr/local/bin/java -Xmx64 -cp ${path}ChatClass 1>${path}log.txt;
echo 'Programm hat funktioniert!';


Wenn pwd nur 1x aufgerufen wird, ändert sich natürlich auch nicht der angezeigte Wert.
(Man gut, wenn selber seine Fehler findet...)