2014-11-24 39 views
0

我遇到一个很奇怪的行为失败。我发现似乎是一种工作,但我希望有人能向我解释为什么我看到这种疯狂的行为。通过ssh运行脚本时在本地同一脚本成功

的高层我在做什么:我想有一个shell脚本来阻止我的过程。我希望它足够强大,可以杀死我正在寻找的一个或多个实例。我不想,如果没有进程中运行(意思是我希望有一个0返回码传递给kill命令......不是一个空洞的ARG列表)

我所看到的是一个脚本行为它失败当通过ssh传递一个命令而不是在本地执行相同的脚本时调用不同。非常奇怪的是,通过向我的ssh命令添加一个看似任意的命令,我能够让我的脚本正确执行,并且我不知道为什么!

停止素文字(回声statments在那里帮我调试 - 不是真正的脚本的一部分)

echo "Stopping myProcess" echo "-->的ps aux | grep myProcess | grep -v grep " pid= ps -ef | grep myProcess | grep -v grep |从不同的机器虽然脚本的执行的

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

结果:当NO进程运行AWK '{打印$ 2}' echo "Here: ${pid}" if [[ ! -z $pid ]]; then echo "Here2" kill -9 $pid else echo "Here3" echo "not stopping anything - no myProcess process running." fi echo "Here4" exit 0

结果脚本的本地执行的以下命令:

命令:

SSH eak0703 @ myServer上 '源$ {HOME}/.bash_profile中; CD /usr/local/myprocess/bin/;./stop-myProcess。'

结果:

Stopping myProcess --> eak0703 2099 0.0 0.0 10728 1500 ? Ss 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2100 0.0 0.0 10740 992 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess eak0703 2101 0.0 0.0 10740 668 ? S 17:08 0:00 bash -c source ${HOME}/.bash_profile;cd /usr/local/myProcess/bin/;./stop-myProcess Here: 2099 2100 2105 Here2

注意:一些奇怪的和难以解释的,以我的理由,似乎有我的命令3所调用。我也知道,这个命令不会因为通过kill -9被调用时用0我假定这是一个退出代码终止,进程ID拾起grep的都没有了。

现在 - 这里有一个额外的 “日期| grep的废话” 的相同的SSH命令抛出:

命令:

SSH eak0703 @ myServer上“源$ {HOME}/.bash_profile中; CD。/usr/local/myprocess/bin /; date | grep的废话; ./停止myProcess'

结果:

Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4

把 “日期| grep的废话” 解决的事情。看起来,魔法是在“|” (管道)操作员。所以我实际上可以使用“anycommand | anyothercommand”来完成这项工作。

我可以使它工作 - 但我怎么能证明随机离开这样一个块在bash脚本?没有人会知道为什么会出现这种情况。连我都没有!如果有人遇到这个请帮忙!

回答

2

解析ps找到一个过程是脆弱和容易出错的。你举的例子是一个很好的例子,为什么:

不相关的进程(在bash过程ssh启动)包含进程名作为命令行的一部分,并无意中捡到了你的ps解析器。

当您使命令行包含单词“grep”时,无关进程将被您的grep -v grep删除。可以使用pgreppkill。这些工具基于可执行文件名称列出/终止进程,因此远比解析ps更强大。

+0

是的!这是对的。我仍然想知道为什么我的bash命令运行的似乎有3个“实例”? – eak12913 2014-11-24 23:38:21

+0

另外 - 对于任何试图杀死可能具有相同名称(例如:java)但具有不同参数的几个进程之一并希望使用pkill/pgrep的用户,他们应该使用'-f'标志,以便查询是匹配完整的参数列表。 # – eak12913 2014-11-24 23:40:52

+0

@ eak0703 1.由ssh调用的'bash'进程,2.执行'./ stop-myProcess'脚本的fork,因为它没有shebang,并且3 。你的命令替换的子shell。 – 2014-11-24 23:53:28