我正在使用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脚本启动一个命名的screen会话,并在其中运行一个Java应用程序(java -jar file.jar)。我几乎把这整件事都搞定了。唯一不起作用的是,当Java应用程序启动时,它无法读取众多本地配置文件中的一个。
Apache以拥有主目录、bash脚本和Java应用程序的同一用户身份运行(本地用户)。如果以与Apache相同的用户身份从CLI运行bash脚本,则一切都将100%正常工作。文件权限不是问题。
我真正的问题是找出什么是罪魁祸首。Java应用程序是否编码错误,在错误的位置查找配置。文件?我的PHP错了吗?Apache是不是错了?是不是有一个脚本缺少了术语,从而破坏了某些东西?我真的不知道该从何说起。
只是重申一下,如果我去掉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
发布于 2010-10-18 07:13:33
您是否使用配置文件的绝对路径?如果没有,它可能会使用类路径来查找它们,这很容易在您的手动测试和通过php调用之间有所不同。
我倾向于java部分的问题。要么是它里面的东西,要么是它所调用的环境。您可以使用一个简单的perl脚本来转储环境设置,并查看有什么不同:
#!/usr/bin/perl
for my $key (keys %ENV) {
print "$key: $ENV{$key}\n";
}如果这没有显示出任何关键的区别,那么也许你应该试着发布一些java东西的关键部分。
发布于 2010-10-20 19:40:09
可能是用户环境问题,apache在有限的环境下运行您可能需要重新创建用户的默认环境值以正确运行程序(在这种情况下是java)。
https://stackoverflow.com/questions/3955708
复制相似问题