有人能告诉我为什么这个shell脚本没有按照我想要的方式工作

时间:2011-02-05 21:31:18

标签: bash sh

ssh hostname ps aux| egrep '.*python' | grep -v 'grep'| awk '{print $2}'| xargs kill -KILL

当我运行此操作时,我收到错误消息“kill:No such process”

但是当我跑这个时:

ssh hostname ps aux| egrep '.*python' | grep -v 'grep' |awk '{print $2}'| xargs echo

正确打印pid。而且

ps aux| egrep '.*python' | grep -v 'grep'| awk '{print $2}' | xargs kill -KILL

在localhost上正常工作。

4 个答案:

答案 0 :(得分:3)

您的命令仅在远程主机上运行ps aux,其他所有内容都在本地执行。

将其更改为

  

ssh hostname“ps aux | egrep'。* python'| grep -v'grep'| awk'{print \ $ 2}'| xargs kill -KILL”

引号的使用将整个命令发送到远程主机。然后你必须在\前添加$2,因为你在双引号内,那些单引号只是那个时候的字符

答案 1 :(得分:1)

正如其他人所指出的那样,你不能只通过ssh运行一个管道命令,而不必将命令序列放在引号中。

但是有一种更简单的方法可以做你想做的事情:

ssh hostname pkill python

pkill命令将为您处理所有进程grepping。

答案 2 :(得分:0)

它无法正常工作,ssh的输出在本地计算机上处​​理。因此,对kill的调用将尝试在您的机器上终止进程,而不是在远程机器上。

您可以尝试使用expect工具来解决问题。

答案 3 :(得分:0)

这是因为只有第一个命令(ps aux)被提供给ssh作为args。尝试使用引号: ssh主机名“ps aux | egrep'。* python'| grep -v'grep'| awk'{print $ 2}'| xargs kill -KILL”

在这种情况下,“ps aux | egrep'。* python'| grep -v'grep'| awk'{print $ 2}'| xargs kill -KILL”将作为第二个参数传递给ssh命令