如何通过 SSH 运行子 shell 命令?

如何通过 SSH 运行子 shell 命令?

我有一个通过无密码 SSH 连接的计算机集群,并且我编写了一个实用程序,可以在整个集群上运行命令。它的实现方式是选取文件中存在的机器,在运行通过 SSH 指定的命令时循环遍历它们。

现在我想在集群上运行终止命令。我执行此操作的方法是grep获取进程 ID,然后运行 ​​Kill 命令,如下所示:

kill -9 $(ps -ef | grep service_name | awk '{print $2}')

但是当我运行这个命令时,它会在一台机器上循环,执行该命令,在第二台机器上循环,然后退出,甚至不执行该命令。所以该命令最终只在一台机器上执行。

我阅读了一些相关内容,发现cmd1 $(cmd2)通过 SSH 运行的子 shell 命令无法正确执行。

任何人都可以为我提供解决方法。

答案1

实际上,命令替换(不仅仅是一个子 shell)工作得很好。您的问题是您希望它由远程 shell 在远程系统上执行,因为您要杀死的进程是远程系统上的进程。所以你必须引用它,这有点笨拙,尽管你可以在grepawk.两个选项是:

ssh user@remote "kill -9 \$(ps -ef | awk '/service_name/{print $2}')"
ssh user@remote 'kill -9 $(ps -ef | awk "/service_name/{print \$2}")'

然而,在大多数 Linux 和一些(?)其他 Unix 上解决这个问题的更好的解决方案是pkill搜索运行特定命令的进程并杀死它们:

ssh user@remote pkill -9 service_name

根据进程的启动方式,您可能需要搜索完整的命令行:

ssh user@remote pkill -f -9 service_name

答案2

你不应该用管道将 grep 输入到 awk 中!

ps -ef | awk '/service_name/ { print $2}' | xargs kill -9

或者

pkill service_name

答案3

尝试:

ps -ef | grep service_name | awk '{print $2}' | xargs kill -9

您可能想先测试一下。

答案4

kill -9 $(ps -ef | awk "/service_name/{print \$2}")我用“`”字符包装了该命令,并使用我的实用程序运行它,它的工作就像一个魅力。所以下面是最终的命令:

`kill -9 $(ps -ef | awk "/service_name/{print \$2}")`

相关内容