Назад | Перейти на главную страницу

Удаленная команда ssh: уничтожена сигналом 15

сценарий:

#!/usr/bin/env bash
set -e
set -u
set -x
set -o pipefail

hosts=(
    host1
    host2
)
for host in ${hosts[@]}
do
  ssh $host 'pids=$(ps -aux|pgrep -f "/usr/bin/nmon"); kill $pids; wait $pids 2>/dev/null'
done

с выходом:

+ for host in '${hosts[@]}'
+ ssh host1 'pids=$(ps -aux|pgrep -f "/usr/bin/nmon" |awk "{print $2}") ; kill $pids ; wait $pids 2>/dev/null'
Killed by signal 15.

Я использовал wait захватить сигнал, но все равно не работает?
Любая помощь будет оценена по достоинству!

Я думаю, что здесь происходит то, что pgrep -f "/usr/bin/nmon" также соответствует оболочке, выполняющей эту команду, поскольку она найдет строку "/ usr / bin / nmon" в полной командной строке, а вы указали -f для поиска строки во всей командной строке (а не только в Имя процесса...)

В вашем скрипте много неправильных вещей:

ps -aux|pgrep -f "/usr/bin/nmon"

Или:

ps -aux|pgrep -f "/usr/bin/nmon" |awk "{print $2}"

Это все неверно. pgrep работает сам по себе, вам не нужны каналы. ps ... | grep ... это вещь, но pgrep ищет шаблон в самом списке процессов, поэтому нет ps необходимо. Вам также не нужно awk чтобы вырезать поля, поскольку pgrep уже возвращает только PID.

Затем:

kill $pids

Не используйте pgrep для поиска pid-идентификаторов, а затем их уничтожения отдельной командой ... Вместо этого просто используйте pkill напрямую! pkill - это брат pgrep, который найдет процессы и отправит им сигнал уничтожения. Вы даже можете увидеть общие ресурсы pgrep и pkill та же страница руководства поскольку они так похожи.

wait $pids

Это тоже не работает ... Потому что вы можете только позвонить wait на процессах, которые являются дочерними по отношению к текущему процессу. Вы не можете вызвать это просто для любого процесса. Учитывая, что вы только что открыли эту оболочку через ssh, вы не можете ждать этих процессов, которые уже были там ...

Итак, вкратце: нет каналов, просто используйте pkill напрямую, опустите -f (так что он соответствует только командам / usr / bin / nmon) и не ждите:

for host in "${hosts[@]}" ; do
    ssh "$host" pkill /usr/bin/nmon
done

Легко!

Я также исправил цитирование оболочки для вас ... Короче: вы хотите заключить в двойные кавычки все переменные, которые расширяются до одного слова. Ну и массив там тоже.

Надеюсь, это поможет!