Очистка ловушки для команды ssh на нескольких удаленных хостах

Очистка ловушки для команды ssh на нескольких удаленных хостах

Я хочу выполнить произвольную команду на нескольких удаленных хостах с помощью 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.

Связанный контент