我需要通过php执行shell脚本。我正在使用Apache web服务器来运行我的php页面。
我知道还有其他类似我的问题(我已经经历过),但出于某些原因,我无法使我的工作。
下面是我的php文件:
<?php
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh');
echo "<pre>" . $output . "</pre>";
?>这是我的shell脚本copytoallhdfs.sh
#!/bin/bash
myarray=`bin/hdfs dfs -ls -C /`
echo $myarray;
for name in $myarray
do bin/hdfs dfs -copyFromLocal myData/* $name;
done我的copytoallhdfs.sh脚本位于路径/usr/local/hadoop-3.0.2上。因此,通常php应该执行我的shell脚本并显示echo $myarray;的输出,但是浏览器上没有显示任何内容。
可能是权限问题或我的php.ini中缺少的东西,但我就是解决不了这个问题。
有人能给我个工作吗。
谢谢。
发布于 2019-02-23 20:24:40
有了@nacho的评论,我想如果要对我的 sh 脚本的位置做些什么,我会编辑我的sh脚本并插入pwd来验证它给我的位置。然后我意识到它给了我apache目录的位置。
因此,我更改了位置并插入了执行命令bin/hdfs的完整路径。啊,真灵!
下面是我更新的脚本:
#!/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这是个愚蠢的错误,但我想这是有可能发生的!
发布于 2019-02-23 18:37:55
使用2>&1来实现这一点
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh 2>&1');2引用进程的第二个文件描述符,即stderr。
>的意思是重定向。
&1意味着重定向的目标应该与第一个文件描述符(即stdout )的位置相同。
https://stackoverflow.com/questions/54844798
复制相似问题