Убить удаленный процесс через ssh

Убить удаленный процесс через ssh

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

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'"

Связанный контент