Неожиданное поведение в скриптах bash для функции ssh - PullRequest
0 голосов
/ 03 октября 2019

Я создал кластер 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
$@
}

Где другие пользователи просто смотрят нахост-файл, в котором я предварительно скомпилировал все остальные малиновые pis в кластере с их статическими IP-адресамиЯ также настроил 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 в пи и вызываю команду, она работает просто отлично.

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

Я экспортировал все правильные пути в .bashrc. У меня есть chown всех соответствующих каталогов на каждом пи. Что бы я ни пытался, просто команды spark и hadoop не регистрируются. Все остальное есть. У меня даже есть функция, которая будет выполнять копирование файлов по всему кластеру

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

Я настраиваю 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-впи, все экспортированные пути работают нормально, только когда я пытаюсь запустить команду clustercmd , что hadoop и spark не найдены

Решено

Я исправил это, переместиввсе экспорты выше этой строки в .bashrc

# If not running interactively, don't do anything
case $- in
*i*);;
*) return;;
esac

И я добавил его в .profile в домашнем каталоге. Первоначально это было предложено Мангустой, он просто добавил слово в файл ".bash_profile", когда оно должно быть просто "профиль"

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

~/.bashrc выполняется, когда вы уже вошли в систему и хотите открыть новое окно терминала или выполнить новый экземпляр оболочки.

Если вы входите в систему компьютера (локально или удаленно), то на самом деле выполняется~/.bash_profile, а не ~/.bashrc.

Попробуйте включить папки HADOOP_HOME и SPARK_HOME в PATH внутри .bash_profile на всех ваших pi_N хостах

1 голос
/ 03 октября 2019

Я думаю, что вы можете напрямую отладить проблему, о которой сообщает bash («команда не найдена»), запустив

echo $PATH

в оболочках ssh на каждом RPi и сравнив результат с результатом

clustercmd 'echo $PATH'

Возможно, это покажет, что ответ Мангусты правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...