帮助从PHP执行bash脚本

时间:2010-10-17 23:06:39

标签: php bash

我正在使用Apache和PHP来执行bash脚本并遇到问题。伪代码......

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

bash脚本然后启动一个命名的屏幕会话,并在其中运行Java应用程序(java -jar file.jar)。我几乎完成了这件事。唯一不起作用的是Java应用程序启动时,它无法读取其中许多本地配置文件。

Apache作为拥有主目录和bash脚本以及Java应用程序(本地用户)的同一用户运行。如果bash脚本是直接从CLI运行的,因为与Apache运行的用户相同,一切都可以100%运行。文件权限不是问题。

我真正的问题是找到应该承担的责任。 Java应用程序编码错误,查找配置的错误位置。文件?我的PHP错了吗? Apache错了吗?是缺少TERM的脚本之一,从而打破了什么?我真的不知道从哪里开始。

重申一下,如果我删除PHP和网站并从命令行执行bash脚本,它就可以了。如果我从PHP执行脚本,则无法读取其中一个Java应用程序的配置文件。

HTML,Javascript,PHP和bash之间有很多代码。如果您认为发布每个脚本对我有帮助,我会。

编辑:我尝试过的最新事情是确认我的php脚本中的工作目录是否正确..相关部分如下:

<?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'");
 }
?>

所以我首先进入适当的目录,然后从当前工作目录运行脚本(启动屏幕,然后运行其中的java应用程序)。如果我在错误的目录中,该文件将不存在,因此无法启动。

编辑:以下是用户和网络环境的结果:http://pastebin.com/ip0McMUc

2 个答案:

答案 0 :(得分:1)

您是否使用配置文件的绝对路径?如果没有,它可能正在使用类路径来查找它们,并且在您的手动测试和通过php调用之间可能会有很大不同。

我倾向于使用java部分的问题。它中的某个东西或它所调用的环境。你可以使用一个简单的perl脚本来转储环境设置,看看有什么不同:

#!/usr/bin/perl

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

如果这没有显示任何关键差异,那么你应该尝试发布一些关键的java东西。

答案 1 :(得分:0)

可能是用户环境问题,apache在有限环境下运行,您可能需要重新创建用户的默认环境值才能正常运行程序(在这种情况下为java)