我正在经历一种非常奇怪的行为。我已经找到了一个工作,但我希望有人能解释我为什么看到这种疯狂的行为。
我正在做的高级工作:我希望有一个shell脚本来停止我的进程。我希望它足够健壮,可以杀死一个或多个我想要的进程实例。如果没有进程运行,我不希望它失败(这意味着我希望返回0代码…而不是传递给kill命令的空参数列表)
我看到的是,通过ssh传递命令调用脚本时,脚本的行为与在本地执行相同脚本时的行为不同。非常奇怪的是,通过在ssh命令中添加一个看似任意的命令,我可以让脚本正确执行,但我不知道为什么!
stop scipt(echo语句是用来帮助我调试的,不是真正脚本的一部分)
echo "Stopping myProcess" echo "-->ps aux | grep myProcess | grep-v grep" pid=ps-ef | grep myProcess | grep-v grep | 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
在没有进程运行时本地执行脚本的结果:
Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4
通过以下命令从其他计算机执行脚本的结果:
命令:
ssh eak0703@myServer'source${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次调用。我也知道这个命令不会以0的退出代码终止。我假设这是因为在调用kill-9时,grep获取的进程id已经不存在了。
现在-这里有同一个ssh命令,其中有一个额外的“date | grep crap”:
命令:
ssh eak0703@myServer'source${HOME}/.bash\u profile;cd/usr/local/myprocess/bin/;date | grep crap;/stop myprocess'
结果:
Stopping myProcess --> Here: Here3 not stopping anything - no myProcess running. Here4
把“约会| grep crap”放进去可以解决问题。似乎魔法在“|”(管道)操作符中。所以我可以用“anycommand | anyothercommand”来实现这个功能。
我可以让它工作-但我怎么能证明随机留下这样一个金块在一个巴什脚本??? 没人会知道这是为什么。连我都不行!如果有人遇到过这种情况,请帮忙!

最佳答案

解析ps以查找进程是脆弱且容易出错的。你的例子很好地说明了为什么:
一个不相关的进程(由bash启动的ssh进程)包含进程名作为命令行的一部分,并被您的ps解析器意外地获取。
当您使命令行包含单词“grep”时,grep -v grep将删除不相关的进程。
相反,只需使用pgreppkill。这些工具基于可执行文件名列出/终止进程,因此比解析要健壮得多。

关于linux - 当本地相同脚本成功时,通过ssh运行脚本失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27115381/

10-11 06:46