我正在使用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
答案 0 :(得分:1)
您是否使用配置文件的绝对路径?如果没有,它可能正在使用类路径来查找它们,并且在您的手动测试和通过php调用之间可能会有很大不同。
我倾向于使用java部分的问题。它中的某个东西或它所调用的环境。你可以使用一个简单的perl脚本来转储环境设置,看看有什么不同:
#!/usr/bin/perl
for my $key (keys %ENV) {
print "$key: $ENV{$key}\n";
}
如果这没有显示任何关键差异,那么你应该尝试发布一些关键的java东西。
答案 1 :(得分:0)
可能是用户环境问题,apache在有限环境下运行,您可能需要重新创建用户的默认环境值才能正常运行程序(在这种情况下为java)