如何避免 grep 命令上的垃圾选项错误

如何避免 grep 命令上的垃圾选项错误

我需要检查服务器上是否正在运行进程。但挑战是,我使用的关键字不是 userid ,它是 o/p 或 ps 命令的一部分。

当我跑步时ps -ef | grep -v $$ | grep xenon,我得到的是

错误:垃圾选项

用法: ps [选项]

尝试使用“ps --help”或“ps --help”获取其他帮助文本。

有关详细信息,请参阅 ps(1)。 xenon 未运行,请检查错误:垃圾选项

在服务器上,由于某种原因,我看不到 的 O/P pgrep,这将解决我的挑战。他是服务器的操作员。

$ps -ef | grep xenon
venom   3157  95310  0 23:08 pts/5    00:00:00 grep --color=auto xenon
root      45943      1  0 Apr12 ?        00:17:47 /opt/xenon/sganet/agent/lib64/sganetwatchdog -vm=/opt/xenon/sganet/agent/lib64/sganetos -logdir /opt/xenon/sganet/log -ini ../conf/ruxitwatchdog.ini
root      45981  45943  2 Apr12 ?        08:20:31 /opt/xenon/sganet/agent/lib64/sganetos -Dcom.compuware.apm.WatchDogTimeout=9000 -Dcom.compuware.apm.WatchDogPort=5000
$pgrep xenon
$pgrep -c xenon
0
$

这是我编写的脚本,基本上是为了检查验证服务器上运行的多个进程。

#!/bin/bash
set +x
USER=`whoami`
#pg='ps -ef | grep -v $USER | '
pg='ps ax | grep -v grep | '
#--------function to check process ---------#
check_process() {

  $pg $1 >/dev/null && echo -e "$1 is running" || echo -e "$1 is not running, please check "
}

#--------Checking process on the server---------#

echo -e "\n\n checking the processes"
check_process xenon
check_process upnew

答案1

发生 shell 参数扩展管道的高级解析将行分成结构化命令,因此您的函数体就像您编写的那样运行

ps ax '|' grep -v grep '|'

- 也就是说,使用管道作为 的文字参数ps。这就是你收到错误的原因ps(不是来自grep!)抱怨它不理解这个|论点。

您可以通过以下几种方式解决这个问题:

  1. 只需将命令写入函数即可,而不是使用变量pg。对我来说这似乎是最好的版本,但您的实际脚本可能更复杂。
  2. 如果确实需要类似的东西,请使用函数来包含管道:

    pg_cmd_1() {
        ps ax | grep -v grep | $1
    }
    pg=pg_cmd_1
    

    并按原样进行。这将允许您定义其他函数并pg动态更改变量以在必要时使用它们。


此外,正如目前所写,您的脚本正在尝试运行ps ax | grep -v grep | xenon,我认为这仍然不是您想要的(缺少一个grep?)。

相关内容