用PHP执行Shell脚本

时间:2019-02-23 18:34:37

标签: php shell hadoop

我需要通过 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 中缺少某些东西,但我只是无法解决此问题。
谁能帮我解决这个问题。

谢谢。

2 个答案:

答案 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

那是一个愚蠢的错误,但我想它可能会发生!