通过 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

命令$(..)替换将会失败,因为$即使本地 shell 扩展了它被传递给命令stdinssh。您要么需要转义它,要么使用here-string。

awk此外,打印中的命令$2也会作为命令行参数进行插值。因此,我们对其进行转义以推迟其扩展,直到远程执行命令为止。

随着逃跑,

ssh remotehost "kill -9 \$(ps -aux | grep foo | grep bar | awk '{print \$2}')"

或使用此处文档

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

相关内容