2010-10-17 6 views
0

J'utilise Apache avec PHP pour exécuter un script bash et je rencontre un problème. Pseudo code ...Aide pour l'exécution du script bash depuis PHP

Website Button -> Click -> jQuery.post("file.php") -> php: system("/home/user/file.sh cmd") -> bash: screen -S name -> bash: java -jar file.jar 

Le script bash commence alors une session écran nommé et exécute une application Java (java -jar file.jar) à l'intérieur de celui-ci. J'ai presque tout ce travail. La seule chose qui ne fonctionne pas est lorsque l'application Java est lancée, elle est incapable de lire un, parmi plusieurs, de ses fichiers de configuration locaux.

Apache fonctionne le même utilisateur qui possède le répertoire et le script bash et l'application Java (un utilisateur local). Si le script bash est exécuté directement à partir de l'interface de ligne de commande, le même utilisateur que Apache s'exécute sous, tout fonctionne à 100%. Les autorisations de fichiers ne sont pas un problème.

Mon vrai problème ici est de trouver ce qu'il faut blâmer. L'application Java est-elle codée incorrectement, en recherchant le mauvais emplacement pour la configuration? fichier? Mon code PHP est-il faux? Apache a t-il tort? Est-ce que l'un des scripts manque TERM et donc casser quelque chose? Je ne sais vraiment pas par où commencer.

Je répète, si je coupe PHP et le site Web et exécutez le script bash de la ligne de commande, cela fonctionne. Si j'exécute le script depuis PHP, l'un des fichiers de configuration de l'application Java ne peut pas être lu.

Il y a beaucoup de code ici, entre le HTML, Javascript, PHP et bash. Si vous pensez que ça va m'aider à poster chaque script, je le ferai.

Edit: La dernière chose que j'ai essayé est de confirmer que le répertoire de travail dans mon script php est correct .. Les parties pertinentes ci-dessous:

<?php 
session_start(); 
$action = $_REQUEST['action']; 
$user = "public"; 
$home = "/home/minecraft/$user/mc/"; 
$script = "minecraft.sh"; 
$lck = "/home/minecraft/$user/mc/server.log.lck"; 
chdir($home); 

function perform_action($action, $script, $home){ 
    echo("Performing $script $action\n"); 
    system("sh -c 'cd $home && ./$script $action'"); 
} 
?> 

Je suis d'abord en train de changer dans le répertoire approprié, puis en exécutant le script (qui démarre l'écran, puis l'application java à l'intérieur) à partir du répertoire de travail en cours. Si j'étais dans le mauvais répertoire, le fichier n'existerait pas et ne commencerait donc pas.

EDIT: Voici les résultats de l'utilisateur et l'environnement web, avant et après: http://pastebin.com/ip0McMUc

Répondre

1

Utilisez-vous des chemins absolus à vos fichiers de configuration? Sinon, il peut utiliser le classpath pour les trouver, et cela pourrait facilement être différent entre votre test manuel et votre invocation via php. Je suis penché vers le problème étant avec la partie Java. Soit quelque chose ou l'environnement son invoqué Vous pouvez utiliser un simple script perl pour vider les paramètres d'environnement et de voir ce qui est différent.

#!/usr/bin/perl 

for my $key (keys %ENV) { 
    print "$key: $ENV{$key}\n"; 
} 

Si cela ne fait pas apparaître de différences clés alors peut-être vous devriez essayer de poster quelques morceaux clés de la substance java.

+0

Bonne idée. J'ai juste essayé, mais j'ai toujours le même problème. group-txt-location =/home/minecraft/public/mc/groups.txt – Kyle

+0

Pour vous assurer que vous pouvez exécuter file.sh à partir de différents dossiers tels que/et qu'il fonctionne toujours? –

+0

Oui, si je cd /; /home/minecraft/public/mc/minecraft.sh start, tout fonctionne. – Kyle

0

probablement des problèmes d'environnement utilisateur, exécutez apache avec un environnement limité, vous pourriez avoir besoin de recréer les valeurs de l'environnement par défaut de l'utilisateur pour exécuter le programme correctement (java dans ce cas)

+0

Cela semble prometteur ... Pourriez-vous expliquer un peu plus? – Kyle

+0

J'ai eu le même cas avec l'exécutable d'appel perl qui nécessitait plus de variable d'environnement que l'utilisation d'apache. utilisez phpinfo pour voir quel est l'environnement de votre script php, puis comparez celui utilisé par un utilisateur capable d'exécuter le script/exécutable, utilisez putenv pour ajouter la variable d'environnement nécessaire. @bemace semble fournir une partie de la solution. – dvhh

+0

le suspect principal serait LD_LIBRARY_PATH puis le CLASSPATH. peut-être que vous pourriez imprimer le résultat de l'appel "système". – dvhh