Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当本地相同的脚本成功时,通过ssh运行脚本失败_Linux_Bash_Ssh - Fatal编程技术网

Linux 当本地相同的脚本成功时,通过ssh运行脚本失败

Linux 当本地相同的脚本成功时,通过ssh运行脚本失败,linux,bash,ssh,Linux,Bash,Ssh,我正在经历一种非常奇怪的行为。我已经找到了一个看似可行的方法,但我希望有人能向我解释为什么我会看到这种疯狂的行为 我正在做的高级工作:我希望有一个shell脚本来停止我的进程。我希望它足够健壮,能够杀死我正在搜索的流程的一个或多个实例。如果没有进程运行,我不希望它失败(这意味着我想要一个0返回码…而不是传递给kill命令的空arg列表) 我看到的是,通过ssh传递命令调用脚本时,脚本的行为与本地执行相同脚本时不同。非常奇怪的是,通过在ssh命令中添加一个看似任意的命令,我可以让脚本正常执行,但我

我正在经历一种非常奇怪的行为。我已经找到了一个看似可行的方法,但我希望有人能向我解释为什么我会看到这种疯狂的行为

我正在做的高级工作:我希望有一个shell脚本来停止我的进程。我希望它足够健壮,能够杀死我正在搜索的流程的一个或多个实例。如果没有进程运行,我不希望它失败(这意味着我想要一个0返回码…而不是传递给kill命令的空arg列表)

我看到的是,通过ssh传递命令调用脚本时,脚本的行为与本地执行相同脚本时不同。非常奇怪的是,通过在ssh命令中添加一个看似任意的命令,我可以让脚本正常执行,但我不知道为什么

停止脚本(echo语句是用来帮助我调试的-不是真实脚本的一部分)

echo“停止我的进程”
echo“-->
ps aux | grep myProcess | grep-v grep
”
pid=
ps-ef | grep myProcess | grep-v grep | awk'{print$2}'

echo“Here:${pid}”
如果[!-z$pid]];然后
回声“Here2”
杀戮-9美元
其他的
回音“Here3”
echo“不停止任何操作-没有myProcess正在运行。”
fi
回音“Here4”
退出0

无进程运行时本地执行脚本的结果:

停止myProcess
-->
在这里:
这里3
不停止任何操作-不运行myProcess。
此处4

通过以下命令从其他计算机执行脚本的结果:

命令:

ssheak0703@myServer'source${HOME}/.bash_profile;cd/usr/local/myprocess/bin//停止我的进程'

结果:

停止myProcess
-->eak0703 2099 0.0 0.0 10728 1500?ss17:080:00bash-csource${HOME}/.bash_profile;cd/usr/local/myProcess/bin//停止我的进程
eak0703 2100 0.0 0.0 10740 992?S 17:08 0:00 bash-c源代码${HOME}/.bash_profile;cd/usr/local/myProcess/bin//停止我的进程
eak0703 2101 0.0 0.0 10740 668?S 17:08 0:00 bash-c源代码${HOME}/.bash_profile;cd/usr/local/myProcess/bin//停止我的进程
这里:2099
2100
2105
此处2

注意:由于一些奇怪和我无法解释的原因,似乎有3次调用我的命令。我还知道,此命令不会以退出代码0终止。我假设这是因为当kill-9被调用时,grep获取的进程id已经消失了

现在-这里是同一个ssh命令,添加了一个额外的“date | grep crap”:

命令:

ssheak0703@myServer'source${HOME}/.bash_profile;cd/usr/local/myprocess/bin/;日期| grep crap/停止我的进程'

结果:

停止myProcess
-->
在这里:
这里3
不停止任何操作-不运行myProcess。
此处4

把“日期| grep垃圾”放进去可以解决问题。似乎魔力在于“|”(pipe)操作符。因此,我实际上能够使用“anycommand | anyothercommand”实现这一功能


我可以让它工作-但我如何证明在bash脚本中随机留下这样一块金块是合理的???没有人会知道为什么会这样。连我都不行!如果有人遇到这种情况,请帮助

解析
ps
以查找流程是脆弱的,而且容易出错。你的例子很好地说明了为什么:

一个不相关的进程(由
ssh
启动的
bash
进程)包含作为命令行一部分的进程名,并且被
ps
解析器意外地拾取

当您使命令行包含单词“grep”时,
grep-v grep
将删除不相关的进程


相反,只需使用
pgrep
pkill
。这些工具基于可执行文件名列出/终止进程,因此比解析
ps

更健壮!这是正确的。我仍然想知道为什么我的bash命令会有3个“实例”在运行?同样,对于那些试图杀死几个同名进程中的一个进程的人(例如:java)但是不同的参数和想要使用pkill/pgrep,他们可能应该使用
-f
标志,以便查询与完整的参数列表匹配。默认值是与进程名称匹配。@eak0703 1。ssh调用的
bash
进程,2。执行
/stop myProcess
脚本的fork,因为它没有shebang和3。命令替换中的子shell。