使用php执行shell脚本
我需要通过php执行一个shell脚本。我正在使用Apacheweb服务器来运行我的php页面 我知道还有其他类似的问题(我已经经历过),但由于某些原因,我无法使我的工作 这是我的php文件:使用php执行shell脚本,php,shell,hadoop,Php,Shell,Hadoop,我需要通过php执行一个shell脚本。我正在使用Apacheweb服务器来运行我的php页面 我知道还有其他类似的问题(我已经经历过),但由于某些原因,我无法使我的工作 这是我的php文件: <?php $output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh'); echo "<pre>" . $output . "</pre>"; ?> 我的copytoallhdfs.sh
<?php
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh');
echo "<pre>" . $output . "</pre>";
?>
我的copytoallhdfs.sh脚本位于路径/usr/local/hadoop-3.0.2上代码>。所以通常php应该执行我的shell脚本并显示echo$myarray的输出代码>,但我的浏览器上没有显示任何内容
可能是权限问题或我的php.ini中缺少什么,但我无法解决这个问题。
谁能给我一个解决这个问题的办法
谢谢。使用2>&1
来实现这一点
#!/bin/bash
myarray=`/usr/local/hadoop-3.0.2/bin/hdfs dfs -ls -C /`
echo $myarray;
for name in $myarray
do /usr/local/hadoop-3.0.2/bin/hdfs dfs -copyFromLocal /usr/local/hadoop-3.0.2/myData/* $name;
done
2
指进程的第二个文件描述符,即stderr
表示重定向
&1
意味着重定向的目标应该与第一个文件描述符位于同一位置,即stdout。在@nacho的评论中,我想如果这与我的sh脚本的位置有关。我编辑了我的sh脚本并插入了pwd
,以验证它提供给我的位置。然后我意识到它给了我apache目录的位置
因此,我更改了位置并插入了执行命令的完整路径bin/hdfs
。
成功了
以下是我的更新脚本:
这是一个愚蠢的错误,但我想它可能会发生 我把它作为我的浏览器的输出/usr/local/hadoop-3.0.2/copytoallhdfs.sh:1:/usr/local/hadoop-3.0.2/copytoallhdfs.sh:bin/hdfs:not found
老实说,我不太理解2>1和.2>&1它会将响应发送到srdout或您的变量。我不知道你到底想在shell中实现什么。尝试在脚本文件中使用bin/hdfs的绝对路径作为/bin/hdfsI我不确定你是否使用过Hadoop,但我的shell脚本会将数据文件上载到Hadoop。首先,它循环hadoop文件系统以检索所有可用的文件夹,然后将数据文件上载到这些文件夹。行echo$myarray代码>应该显示hadoop中可用的所有文件夹,但它不会显示在我的浏览器上。我确实使用/copytoallhdfs.sh
运行了我的shell脚本,没有问题。在这种情况下,可能是权限问题,因为php以www data
用户的名义运行Scrit。在该目录上执行chmod
或chown
,或使用@mario i的sudo
.PD可以使其工作。谢谢你的额外支持!
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh 2>&1');
#!/bin/bash
myarray=`/usr/local/hadoop-3.0.2/bin/hdfs dfs -ls -C /`
echo $myarray;
for name in $myarray
do /usr/local/hadoop-3.0.2/bin/hdfs dfs -copyFromLocal /usr/local/hadoop-3.0.2/myData/* $name;
done