剧本:
#!/bin/bash
SERVICE="$1"
RESULT=`ps -a | sed -n /${SERVICE}/p`
MEM=$(ps aux | sort -rk +4 | grep $1 | grep -v grep | awk '{print $4}' | awk 'NR == 1')
if [ "${RESULT:-null}" = null ]; then
echo "$1 is NOT running"
else
echo "$MEM"
fi
if [ "$MEM" -ge 1 ]; then
mailx -s "Alert: server needs to be checked" me@admins.com
fi
ps输出管道传输到sed的问题是即使没有进程正在运行它也会发现自己:
ps aux | sed -n /nfdump/p
root 30724 0.0 0.0 105252 884 pts/1 S+ 14:16 0:00 sed -n /process/p
他们的脚本绕过了预期的结果"服务没有运行"并直接回复$ MEM,在这种情况下将为0.0。 sed是否有一个grep -v grep等效的方法可以让自己脱离困境?
答案 0 :(得分:1)
除了上面的评论之外,让我再添加一个例子。 Sed确实相当于grep -v
:你可以用/RE/!
否定匹配(将!
附加到正则表达式),这样你就可以尝试:
ps aux | sed -n '/sed/!{ /nfdump/ p;}'
此处{ ... }
内的部分仅适用于与<{1}}匹配的 行。
对于记录:有一个命令sed
可以替换 ps sed管道,请参阅pgrep in Wikipedia或其联机帮助页。
答案 1 :(得分:1)
尝试:
ps aux | sed -n '/[n]fdump/p'
或:
ps aux | grep '[n]fdump'
在进程列表
中找不到正则表达式