我需要通过 php 执行 shell脚本。我正在使用 Apache 网络服务器来运行我的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 中缺少某些东西,但我只是无法解决此问题。
谁能帮我解决这个问题。
谢谢。
答案 0 :(得分:1)
使用2>&1
来实现
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh 2>&1');
2
是指进程的第二个文件描述符,即stderr。
>
表示重定向。
&1
表示重定向的目标应与第一个文件描述符(即stdout)位于同一位置。
答案 1 :(得分:0)
使用@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
那是一个愚蠢的错误,但我想它可能会发生!