У меня есть установка, которая ведет себя так, что я не могу понять. Итак, у меня есть локальный сценарий bash generateTrafficOnHosts.sh
который считывает IP-адреса из файла. Затем он вызывает сценарий bash getTraffic.sh
на каждом удаленном хосте, то есть на каждом вызываемом IP-адресе. Однако после первого удаленного выполнения через ssh он просто завершается. Вот мой местный generateTrafficOnHosts.sh
сценарий:
#!/bin/bash
# Connects to a series of hosts and runs the get-traffic.sh script on them.
# The hosts are taken from a file with a list of randomly generated IDs,
# while their IDs are taken from a connectfile.
# ...
# some convenience functions here
# ...
#######################################
# runs the traffic generation script on
# a host.
# Globals:
#
# Arguments:
# <IP of the remote host>
# Returns:
# None
#######################################
function run_on_host() {
local RESULTS
RESULTS=$(ssh -i key.pem user@"$1" '/home/user/get-traffic.sh 2>&1 >/dev/null')
}
#######################################
# Runs the load on the hosts
# Globals:
# HOSTSFILE
# Arguments:
# None
# Returns:
# None
#######################################
function run_load_on_hosts() {
while read line
do
local ip=$(get_ip_for_key ${line})
echo "getting IP for key in line ${line}"
if [[ $ip != "" ]]; then
echo "running on host $line($ip)"
run_on_host "${ip}"
else
echo "error: LINE'$line', IP'$ip'"
fi
done < "$HOSTSFILE"
}
function main() {
check "$@"
run_load_on_hosts
}
main "$@"
Удаленный скрипт get-traffic.sh
выглядит так:
#!/bin/bash
PORT=47111
# Time limit in seconds
TIME_LIMIT=10
# Blocksize of the dd command: how much data shall be downloaded per chunk?
BS=1M
while [[ "$SECONDS" -le "$TIME_LIMIT" ]]; do
# $SECONDS is a shell variable
nc "${HOST}" "${PORT}" | dd count=1 bs="${BS}" iflag=fullblock > /dev/null
done
Теперь о странном поведении: сценарий запускается только для первого хоста в файле hosts. Если я заменю строку ssh -i ...
с, скажем, sleep 1; echo "running..."
, все работает гладко. То же самое происходит, если я заменяю удаленную команду /home/user/get-traffic.sh
например, с ls /home/user
- все хорошо. Однако сценарий также возвращается после первой итерации, если я заменю удаленную команду на ls
.
Я отслеживал эту ошибку уже несколько часов, и несколько часов назад у меня закончились идеи. Кто-нибудь, пожалуйста?!? : |
Посмотрите на ssh
руководство, в частности -t
вариант.
Если это не сработает, попробуйте -tt
вариант. Кроме того, я думаю, что ваш get-traffic.sh
сценарий должен exit 0
в конце.