
У меня есть процесс, который я хочу завершить удаленно. Я пробовал
ssh remotehost "kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')"
но это возвращает ошибку
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Однако если я выполню команду в кавычках
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
на удаленном хосте все работает нормально. Я что-то упускаю?
решение1
Подстановка команды $(..)
не будет выполнена, так как она $
расширяется локальной оболочкой, дажедоон передается в stdin
команду ssh
. Вам нужно либо экранировать его, либо использовать here-строки.
Также команда внутри , awk
которая печатает, $2
интерполируется как аргумент командной строки. Поэтому мы экранируем ее, чтобы отложить ее расширение до тех пор, пока команда не будет выполнена удаленно.
С побегом,
ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"
или с помощью here-doc
ssh remotehost <<'EOF'
kill -9 $(ps -aux | grep foo | grep bar | awk '{print $2}')
EOF
Также обратите внимание, что grep .. | grep .. | awk
это лишнее. Вы можете выполнить всю операцию в awk
одиночку. Или даже лучше использовать pkill
, чтобы заставить процесс убить напрямую по имени.
решение2
Это сработало для меня, чтобы убить набор хостов:
for i in `cat hostlist`;do ssh -q $i kill `ssh -q $i ps -ef | grep <process name>|awk '{print $2}'`;done
решение3
вы можете по желанию сделать что-то вроде
ssh remotehost "killall -r 'foo.*bar'"