如何通过 SSH 运行 subshel​​l 命令?

Pun*_*aik 1 shell bash ssh subshell

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

现在我想在集群上运行一个 kill 命令。我这样做的方法是grep输入进程 ID,然后像这样运行 kill 命令:

kill -9 $(ps -ef | grep service_name | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)

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

我读了一点,发现cmd1 $(cmd2)通过 SSH 运行的subshel​​l 命令无法正确执行。

谁能给我一个解决方法。

dav*_*085 9

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

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

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

ssh user@remote pkill -9 service_name
Run Code Online (Sandbox Code Playgroud)

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

ssh user@remote pkill -f -9 service_name
Run Code Online (Sandbox Code Playgroud)


Arc*_*mar 6

你不能将 grep 导入 awk!

ps -ef | awk '/service_name/ { print $2}' | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

或者

pkill service_name
Run Code Online (Sandbox Code Playgroud)