I have the following bash script, that lists the current number of httpd processes, and if it is over 60, it should email me. This works 80% of the time but for some reason sometimes it emails me anyways when it is not over 60. Any ideas?
#!/bin/bash
lines=`ps -ef|grep httpd| wc -l`
if [ "$lines" -gt "60" ]
then
mailx -s "Over 60 httpd processes" me@me.com < /dev/null
fi
httpd
processes might finish, or start, or both. So, the number of processes can be different. grep
process in the processes (most of the time, it could happen that the ps
finishes before grep
starts). An easy way to avoid that is to change your command to ps -ef | grep [h]ttpd
ps -ef | grep [h]ttpd
. This will make sure that grep
doesn't match grep [h]ttpd
. pgrep
, which might be better suited for your purposes. grep ... | wc -l
grep ... | wc -l
can usually be replaced with grep -c ...
. You've probably thought of this, but ...
At time t0, there are 61.
At time t1, when you read the email, there are 58.
Try including the value of $lines in the email and you'll see.
Or try using /proc/*/cmdline, it might be more reliable.
grep httpd
查找名称中包含httpd的所有进程,包括grep httpd
本身,以及其他可能的进程。
"ps -ef|grep httpd" doesn't find just httpd processes, does it? It finds processes whose full (-f) listing in ps includes the string "httpd".
这可能无法解决您的问题,但您可以通过使用pgrep
来简化操作。
you can do it this way too, reducing the use of grep and wc to just one awk.
ps -eo args|awk '!/awk/&&/httpd/{++c}
END{
if (c>60){
cmd="mailx -s \047Over 60\047 root"
cmd | getline
}
}'
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.