![如何避免 grep 命令上的垃圾选项错误](https://linux22.com/image/152492/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%20grep%20%E5%91%BD%E4%BB%A4%E4%B8%8A%E7%9A%84%E5%9E%83%E5%9C%BE%E9%80%89%E9%A1%B9%E9%94%99%E8%AF%AF.png)
我需要检查服务器上是否正在运行进程。但挑战是,我使用的关键字不是 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
!)抱怨它不理解这个|
论点。
您可以通过以下几种方式解决这个问题:
- 只需将命令写入函数即可,而不是使用变量
pg
。对我来说这似乎是最好的版本,但您的实际脚本可能更复杂。 如果确实需要类似的东西,请使用函数来包含管道:
pg_cmd_1() { ps ax | grep -v grep | $1 } pg=pg_cmd_1
并按原样进行。这将允许您定义其他函数并
pg
动态更改变量以在必要时使用它们。
此外,正如目前所写,您的脚本正在尝试运行ps ax | grep -v grep | xenon
,我认为这仍然不是您想要的(缺少一个grep
?)。