Вопрос или проблема
RHEL 8.10
OpenSSH_8.0p1, OpenSSL 1.1.1k FIPS 25 Мар 2021
Как и ожидалось, эта строка (с двумя встроенными командами) возвращает две строки:
$ ssh -q remoteserver "ls -1 /proc/${p}/fd | wc -l ; ps -Ostate -p${p} | tail -n1"
969
1353432 S S ? 00:00:12 pgpool: wait for accept lock
Как мне сохранить каждую строку в отдельную переменную на локальном сервере? (Поскольку я должен запускать ssh
сотни раз, и каждый из них занимает более 0.25 секунд, я пытаюсь минимизировать количество вызовов ssh.)
Цель состоит в том, чтобы, например, переменная FDcnt
имела значение 969, а PidState
была 1353432 S S ? 00:00:12 pgpool: wait for accept lock
.
Это работает, но кажется немного хаковским:
blarge=()
while read -r
do
blarge+=("$REPLY")
done <<<$(ssh -q FISPCDSPGS202c "ls -1 /proc/${p}/fd | wc -l ; ps -Ostate -p${p} | tail -n1")
echo ${blarge[0]}
970
$ echo ${blarge[1]}
1353432 S S ? 00:00:12 pgpool: fis_cds cdsbmop 10.55.96.151(33710) idle
Ответ или решение
Чтобы эффективно обрабатывать многострочный вывод команды SSH и хранить результаты в отдельных переменных на локальном сервере, можно использовать более элегантный и читабельный подход, нежели предоставленный выше. Данный метод не требует массивов и делает код более интуитивно понятным.
Решение
Вы можете использовать команду ssh
в сочетании с командой read
для разделения многократного вывода на разные переменные. Это можно сделать следующим образом:
output=$(ssh -q remoteserver "ls -1 /proc/${p}/fd | wc -l; ps -Ostate -p${p} | tail -n1")
{
read FDcnt
read PidState
} <<< "$output"
echo "Количество файловых дескрипторов: $FDcnt"
echo "Состояние процесса: $PidState"
Пояснение кода
-
Получение вывода: Используем команду
ssh
, чтобы выполнить команды на удалённом сервере и сохраняем весь вывод в переменнойoutput
. -
Чтение из переменной: С помощью блока кода
{ ... }
и командыread
мы читаем строки из переменнойoutput
. Первая строка будет присвоена переменнойFDcnt
, а вторая — переменнойPidState
. -
Вывод результатов: В конце мы выводим значения переменных. Это даёт чёткое представление о том, что делает скрипт, а также каковы результаты.
Преимущества данного подхода
- Читаемость: Код становится более понятным и легче поддерживаемым.
- Эффективность: Метод избегает лишних вычислений, выполняя
ssh
только один раз, что критично при многократных вызовах. - Простота: Не требуется создание массивов, что упрощает структуру кода и снижает вероятность ошибок.
Важные замечания
- Убедитесь, что переменная
${p}
определена и содержит корректное значение перед выполнением команды. - Так как вы работаете с удалённым сервером, возможно, потребуется учитывать сетевые задержки, что может повлиять на время выполнения.
Следуя указанному методу, вы сможете эффективно и надёжно обрабатывать многокомандный вывод посредством SSH, сохраняя результаты в переменных для дальнейшего использования в ваших сценариях.