Я хочу выполнить произвольную команду на нескольких удаленных хостах с помощью ssh. Эти команды в основном долго выполняются, отслеживают ресурсы сервера и объединяют вывод на моей локальной рабочей станции (например tail -f
, mpstat
или tcpdump
/ tcpflow
с grep
и т. д.).
Проблема в том, что я не нашел способа, который позволил бы команде продолжать работу, а затем надежно завершить как SSH-соединение, так и удаленную команду для всех хостов.
Я перепробовал много ssh
вариантов флагов: wait, cat, read, traps и т. д. Либо оба завершаются мгновенно, локальный терминал зависает, либо удаленная команда продолжает выполняться на удаленных хостах после завершения соединения SSH.
Вот что у меня есть на данный момент.
function server_ssh() {
pids=""
for box in 01 02 03; do
ssh -t -t -f server$box "$1" &
pids="$pids $!"
done
trap 'kill -9 $pids' SIGINT
# wait, cat, read ??
}
решение1
Похоже на что-то дляпараллельная работа gnu. Попробуйте что-то вроде этого:
function server_ssh() {
parallel --line-buffer ssh server{} "$1" ::: 01 02 03
}
--line-buffer
опция необходима для разрешения смешивания вывода различных команд (по умолчанию она группирует вывод каждой команды вместе, поэтому приходится ждать завершения каждой из них для отображения).
-u
Здесь тоже должно работать. Обычно это может позволить частям строк смешиваться, но поскольку команды, которые вы используете, скорее всего, основаны на строках, этого не должно происходить.
Редактировать: --line-buffer
в моей версии (20130922-1) находится на стадии альфа-тестирования, я бы выбрал -u
.