Мне нужно проверить, запущен ли процесс на удаленном сервере, и остановить его, если это так. Я пытаюсь обернуть это в более крупный сценарий, и подозреваю, что у меня проблемы с правильным экранированием.
Из командной строки это работает:
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 присвоено элементу массива?