Как я могу назначить результаты, полученные из сеанса s sh, одному элементу в массиве? - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно проверить, запущен ли процесс на удаленном сервере, и остановить его, если это так. Я пытаюсь обернуть это в более крупный сценарий, и подозреваю, что у меня проблемы с правильным экранированием.

Из командной строки это работает:

ssh oracle@<node> <<-EOF
ps -ef | grep tfa | grep java | awk '{print \$NF}'
exit
EOF

Я получаю место, из которого запущен процесс tfa, которое может варьироваться.

/opt/oracle/dcs/oracle.ahf/tfa

Если я не уйду из $ NF, я получу вывод ps, как если бы этот последний awk не был частью command

root     41252     1 30 14:57 ?        00:15:13 /opt/oracle/dcs/oracle.ahf/jre/bin/java -server -Xms64m -Xmx128m -Djava.awt.headless=true -Ddisable.checkForUpdate=true -XX:HeapDumpPath=/u01/app/oracle.ahf/data/<node>/diag/tfa oracle.rat.tfa.TFAMain /opt/oracle/dcs/oracle.ahf/tfa

Теперь я пытаюсь назначить это элементу в ассоциативном массиве

for n in ${remote_nodes[@]};do
  tfa_loc[${n}]=(`${SSH} oracle@${n} <<-EOF
    ps -ef | grep tfa | grep java | awk '{print \\$NF}'
    exit
  EOF`)
done

Но как бы я ни пытался избежать этого, Я продолжаю получать

tfa_loc[${n}]: cannot assign list to array member

, что заставляет меня думать, что он возвращает весь вывод ps и не может назначить все это одному элементу. Когда я делаю то же самое на локальном узле (без подключения s sh), это работает.

Итак - как мне получить только последнее поле команды, запущенной в сеансе s sh присвоено элементу массива?

...