【问题标题】:Bash commands putting out extra information which results into issues with scriptsBash 命令提供额外信息,导致脚本出现问题
【发布时间】:2018-02-08 11:31:58
【问题描述】:

好的,希望我能正确解释这一点,因为我不知道是什么原因造成的,也不知道如何解决。

由于某些原因,bash 命令(在 CentOS 6.x 服务器上)显示的信息比“正常”多,这会导致某些脚本出现问题。我不知道是否有这个名字,但希望有人知道这个的解决方案。

第一个例子。

正确/良好的服务器:

[root@goodserver ~]# vzctl enter 3567
entered into CT 3567
[root@example /]#

(这是正确的行为)

不正确/坏的服务器:

[root@badserver /]# vzctl enter 3127
Entering CT
entered into CT 3127
Open /dev/pts/0
           [root@example /]#

对于“坏”的服务器,它会像往常一样显示更多信息,例如:

  • 进入CT
  • 打开 /dev/pts/0

这就像它解析关于它正在做什么的额外信息。

当然,上面的内容纯属装饰性的,但是对于我们使用的几个 bash 脚本,这些问题确实是个问题。

我们使用的脚本的一部分,使用了以下命令(还有更多,但这主要是一个错误的例子):

 DOMAIN=`vzctl exec $VEID 'hostname -d'`

以上信息的结果在/etc/named.conf中解析。

GOOD 服务器上,它会像这样添加到 named.conf 中:

zone "example.com" {
    type master;
    file "example.com";
    allow-transfer {
            200.190.100.10;
            200.190.101.10;
            common-allow-transfer;
    };
};

以上是正确的。

BAD 服务器上,它会像这样添加到 named.conf 中:

zone "Executing command: hostname -d
example.com" {
    type master;
    file "Executing command: hostname -d
example.com";
    allow-transfer {
            200.190.100.10;
            200.190.101.10;
            common-allow-transfer;
    };
};

所以它添加了它所做的操作,在这个例子中是“Executing command: hostname -d”

另一个例子是我在一个好的服务器和坏的服务器上运行命令。

错误的服务器:

[root@bad-server /]# DOMAIN=`vzctl exec 3333 'hostname -d'`
[root@bad-server /]# echo $DOMAIN
Executing command: hostname -d example.com

好的服务器:

[root@good-server ~]# DOMAIN=`vzctl exec 4444 'hostname -d'`
[root@good-server ~]# echo $DOMAIN
example.com

我的知识有限,但我已经尝试了一些检查 rsyslog 和 grub.conf 的方法,但似乎没有什么异常。

我不知道为什么它会显示额外的信息。

可能这是一些简单/愚蠢的事情,但我已经尝试解决这个问题几个小时了,我真的不知道......

非常感谢任何帮助。

补充资料: 两台服务器都使用: kernel.printk = 7 4 1 7 (不知道有没有用)

【问题讨论】:

  • 我不是 100% 确定这会对您有所帮助,但您至少应该尝试一下:sudo dmesg --console-off
  • 在你给我的命令之后,我调查了一些事情。然而它没有帮助。两者都使用: kernel.printk = 7 4 1 7 所以不是这样.. 不过谢谢。
  • 看看我认为是你的vzctlman 我注意到一个--quiet 选项可能会解决你的问题(“禁用输出。请注意,由 vzctl 运行的脚本仍然能够产生一些输出。”)。所以第二个例子是DOMAIN=$(vzctl --quiet exec $VEID 'hostname -d')。对于第一个示例,我担心它也会禁用“输入 CT 3567”输出。
  • vzctl 必须读取一些特定于服务器的 conf。我根本不知道该工具,因此无法提供进一步帮助,但我已将 openvz 标签添加到您的问题中,希望它能吸引有该工具经验的人。
  • 太好了,不客气! :) 如果一切正常,我建议您发布自己的答案并接受它。

标签: bash shell command-line openvz


【解决方案1】:

好吧(感谢 Aaron 为我指明了正确的方向)我终于找到了导致我在使用此脚本时遇到的所有问题的小罪魁祸首(该脚本适用于所有其他服务器,因此显然无需更改)。

这些问题是由 vz.conf(位于 /etc/vz/ 目录中)中设置的 VERBOSE leven 引起的。那里有一个名为“VERBOSE”的选项,在我的例子中它被设置为 3。

根据 OpenVZ 的网站,它执行以下操作:

Increments logging level up from the default. Can be used multiple times. 
Default value is set to the value of VERBOSE parameter in the global
configuration file vz.conf(5), or to 0 if not set by VERBOSE parameter.

在我将 VERBOSE=3 更改为 VERBOSE=0 后,我的脚本再次正常工作(就像其他所有服务器一样)。 :-)

非常感谢 Aaron 为我指明了正确的方向。当您知道在哪里寻找时,答案很简单!



很抱歉,我对 ndim 的反应有点失望。这是他在那之后的第二次回应非常无助和粗鲁。他显然没有阅读我正确发布的问题。哦,好吧。

【讨论】:

    【解决方案2】:

    我会确保正确解析命令的输出。在这种情况下,我们只对表单的行感兴趣

    entered into CT 12345
    

    这样做的一种方法是通过sed 传递所有内容,并让sed 仅在行看起来如上时打印数字(未经测试,我总是忘记哪些大括号/括号/括号需要在前面加上反斜杠其中):

    whateverthecommand | sed -n 's/^entered into CT ([0-9]{1,})$/\1/p'
    

    【讨论】:

    • 对不起,但与我的问题完全没有关系...不要求 sed 命令!两者都使用完全相同的脚本。所以 sed 在这里根本没有任何用处。我认为这是 bash 或服务器上的一些设置!
    • 您显然还没有正确阅读问题/问题。两台服务器(均为 CentOS 6.x)在两台服务器上使用相同的脚本,但在使用相同的脚本时两台服务器上的输出不同。我的帖子中的其余部分都是示例。
    猜你喜欢
    • 2021-05-17
    • 2020-08-14
    • 2017-09-27
    • 2011-02-20
    • 2019-12-25
    • 1970-01-01
    • 2019-08-19
    • 2019-03-27
    • 1970-01-01
    相关资源
    最近更新 更多