通过 ssh 根据进程名称的部分内容终止进程(运行交互式 ssh 会话时会产生不同的结果)

通过 ssh 根据进程名称的部分内容终止进程(运行交互式 ssh 会话时会产生不同的结果)

我正在尝试做:

根据我 grep 的内容查找进程的 pid,比如说“名称”:

pid=(ps aux | grep '[Ń]ame' | awk '{print $2}' | head -1)

然后杀死它

kill $pid

如果我使用 ssh 登录到计算机,此操作可以正常工作,但我想通过脚本执行此操作。但此时它不起作用:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print $2}' | head -1); echo \$pid"
root 11203 1.5 0.8 6961292 135420 pts/0 Sl 16:52 0:04 java -XX:PermSize=256m -XX:MaxPermSize=512m -Dproperties....

我想知道这样做的方法,以及为什么在后一种情况下执行命令时结果会不同。

答案1

您可以使用 pgrep 来简化搜索,并使用 xargs 管道传输结果以删除 vars 的使用,例如:

ssh hostname "pgrep emacs | head -1 | xargs echo"

您的主要问题是 bash 尝试在 ssh 命令中评估 $2。结果为空白,因此解释为您想要改为管道 `awk '{print }'。您还可以尝试使用另一个转义字符执行:

ssh hostname "pid=\$(ps aux | grep '[N]ame' | awk '{print \$2}' | head -1); echo \$pid"

该版本有效。

答案2

killall有一个-r选项可以通过正则表达式匹配进程名称。

-r, --regexp 将进程名称模式解释为扩展正则表达式。

相关内容