【问题标题】:Reading pid from ssh process grep output from different servers从不同服务器的 ssh 进程 grep 输出读取 pid
【发布时间】:2017-02-06 07:16:36
【问题描述】:

读取来自每个服务器的进程 grep pipe 命令的 PID 并杀死它。 当我运行以下 sn-p - 它为其余服务器显示与第一台主机相同的 ID。换句话说,它不会更新新的 PIDs

for h in host1 host2 host3
do
  if [ $(hostname -s) = $h ]; then
    PID=$(echo "`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`")
  else
    PID=$(ssh $h "echo \"`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`\"")
  fi

  echo "Killing pid - $PID... on $h"
  sleep 5
done

输出如下:

Killing pid - 18334... on host_1
Killing pid - 18334... on host_2
Killing pid - 18334... on host_3

专家 - 我在这里做错了什么?提前感谢您的帮助。

【问题讨论】:

  • 你使用的是 Linux 系统吗?

标签: bash ssh


【解决方案1】:

您的问题来自引用。在引号内引用是很棘手的,而做您想做的事情的最佳方法通常是完全取消在引号内引用。

首先,将远程命令放入一个数组中:

declare -a remote_command=()
remote_command+=(ps -ef '|' grep x_user '|' grep x_project '|')
remote_command+=(grep JMX_SCRIPT.PID=webservice '|' grep '/bin/bash')
remote_command+=('|' awk '{print $2;}')

然后,像这样运行它:

PID="$(ssh $h "${remote_command[@]}")"

数组扩展将满足您的需求,即单独提供每个参数,但不执行扩展或分词。特别是,“管道”符号 (|) 不会在本地解释,而是作为参数传递给 ssh 命令,并在远程解释为管道。

顺便说一句,这种技术的一个优点是,由于您的命令是以编程方式构建的,因此您可以轻松地包含或不包含可选部分(即参数),例如,带有 += 语句的简单 if 块,而且容易出错的引用仍然没有问题。

【讨论】:

    【解决方案2】:

    问题在于您的ssh 命令:

    PID=$(ssh $h "echo \"`ps -ef | grep x_user | grep x_project | grep JMX_SCRIPT.PID=webservice | grep '/bin/bash' | awk '{print $2;}'`\"")
    

    ps -ef ... 部分正在您的本地主机上运行,​​而不是在远程主机上运行。这就是为什么您每次都获得相同的 PID。

    您可以通过将命令管道存储在文件或字符串中并将其提供给ssh 来解决此问题。

    【讨论】:

    • 您是从文件中读取命令并将其作为单个字符串提供给ssh,还是先读取数组中的命令并在ssh 命令中展开该数组?
    • 我不确定字符串方式是否可行。我这么说是因为查尔斯·达菲(Charles Duffy)对我推荐 heredoc 的 ssh 问题给出了类似的解决方案。我删除了他的答案 - 我怀疑他测试了他的方法但没有奏效。
    • 我做了一个类似玩具的小测试,它有效(单字符串方法),但我不能权威地说没有陷阱和远程引用问题。我提出的基于数组的解决方案(据我所知)是您可能会得到的防弹,并且避免了为了避免引用问题而不得不将代码放入文件中。我更喜欢将所有代码保留在脚本中。
    • 我同意 - 我也更喜欢字符串/数组方法。
    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    相关资源
    最近更新 更多