我需要通过 php 执行 shell script 。我正在使用 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 中缺少的一些权限问题或其他问题。
任何人都可以给我一个工作。
谢谢。
使用 2>&1
来实现
$output = shell_exec('sh /usr/local/hadoop-3.0.2/copytoallhdfs.sh 2>&1');
2
是指该过程的第二个文件描述符,即stderr。
>
表示重定向。
&1
表示重定向的目标应与第一个文件描述符,即stdout。
带有@nacho的评论,我想是否对我的 sh script 的位置有事。我编辑了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
这是一个愚蠢的错误,但我想这可能会发生!