ssh函数上bash脚本中的意外行为

cqoc49vn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(511)

我已经构建了一个raspberry pi集群,安装了spark和hadoop,并在.bashrc中创建了一些函数,使通信和交互更加容易

function otherpis {
grep "pi" /etc/hosts | awk '{print $2}' | grep -v $(hostname)
}

function clustercmd {
for pi in $(otherpis); do ssh $pi "$@"; done
$@
}

otherpi只是查看主机文件,我已经在其中用它们的静态ip地址预先编译了集群中的所有其他raspberry pi。我还为ssh配置了授权密钥,这样就不必每次ssh进入时都输入密码。
我可以调用如下命令

$ clustercmd date
Thu 03 Oct 2019 02:00:13 PM CDT
Thu 03 Oct 2019 02:00:11 PM CDT
Thu 03 Oct 2019 02:00:12 PM CDT
......

$ clustercmd sudo mkdir -p /opt/hadoop_tmp/hdfs

而且效果很好。但是由于某种原因,当我尝试用hadoop或spark将任何东西传递到命令时,它会说除了我从中调用命令的pi之外,它找不到命令。

$ clustercmd hadoop version | grep Hadoop
bash: hadoop: command not found
bash: hadoop: command not found
.....
Hadoop 3.2.1

但是当我手动ssh到pi中并调用命令时,它工作得很好。

$ ssh pi2
pi@pi2: $ hadoop version | grep Hadoop
Hadoop 3.2.1

我已经在.bashrc中导出了所有正确的路径。我已经在每个pi上找到了所有相关的目录。不管我尝试什么,只有spark和hadoop命令没有注册。其他的都是。我甚至有一个函数可以跨整个集群进行文件复制

function clusterscp {
for pi in $(otherpis); do
cat $1 | ssh $pi "sudo tee $1" > /dev/null 2>&1
done
}

我在第一个pi上安装了hadoop和spark,然后用上面的函数大量传输了所有的文件和配置,没有任何问题。任何见解都会有帮助
编辑在.bashrc中添加所有导出的路径

export JAVA_HOME=$(readlink –f /usr/bin/java | sed "s:bin/java::")
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
export HADOOP_OPTS="-XX:-PrintWarnings –Djava.net.preferIPv4Stack=true"
export HADOOP_HOME_WARN_SUPPRESS=1
export HADOOP_ROOT_LOGGER="WARN,DRFA"

请注意,正如我前面所说的,当我实际使用ssh连接到pi时,所有导出的路径都可以正常工作,只有当我尝试运行clustercmd命令时,才没有找到hadoop和spark

已解决

我通过在.bashrc中将所有导出移到这一行上方来修复了这个问题


# If not running interactively, don't do anything

case $- in

* i*);;
* ) return;;

esac

我把它添加到主目录的.profile中。这是mangusta最初建议的,他只是在文件“.bash\u profile”中添加了一个单词,而实际上应该是“profile”

juud5qan

juud5qan1#

~/.bashrc 当您已经登录并且想要打开一个新的终端窗口或执行一个新的shell示例时执行。
如果您登录到计算机(本地或远程),实际运行的是 ~/.bash_profile ,不是 ~/.bashrc .
试着包括你在内 HADOOP_HOME 以及 SPARK_HOME 文件夹到 PATH 内部 .bash_profile 在你所有的 pi_N 主机

qf9go6mv

qf9go6mv2#

我认为您可以通过运行

echo $PATH

在每个rpi上的ssh shell中,并将结果与

clustercmd 'echo $PATH'

也许这将表明曼古斯塔的答案是正确的。

相关问题