【问题标题】:Why does my process counting script give false positives?为什么我的进程计数脚本会出现误报?
【发布时间】:2009-12-27 03:12:26
【问题描述】:

我有以下 bash 脚本,它列出了当前 httpd 进程的数量,如果超过 60,它应该给我发电子邮件。这在 80% 的情况下都有效,但由于某种原因,它有时会在未超过 60 岁时给我发电子邮件。有什么想法吗?

#!/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

【问题讨论】:

  • 请考虑重新命名此项,以便回复在搜索结果中更有用。

标签: linux bash unix shell scripting


【解决方案1】:
  1. 检查和发送电子邮件之间存在延迟。在那个时候,一些httpd 进程可能会完成或启动,或两者兼而有之。因此,进程的数量可以不同。
  2. 您将grep 进程包含在进程中(大多数情况下,ps 可能在grep 开始之前完成)。避免这种情况的一种简单方法是将您的命令更改为ps -ef | grep [h]ttpd。这将确保grepgrep [h]ttpd 不匹配。
  3. 在 linux 上,您有 pgrep,这可能更适合您的目的。
  4. grep ... | wc -l 通常可以替换为 grep -c ...
  5. 如果你想限制httpd请求的数量,我相信你可以在apache配置文件中设置。

【讨论】:

  • grep [h]ttpd 好用,不知道...
  • Alok 的第 5 点可能是这里最相关的事情。除非您在某处寻找错误,否则必须手动监控已处理的数量并不是“最佳实践”。
【解决方案2】:

您可能已经想到了这一点,但是...

在时间 t0,有 61 个。

在时间 t1,当您阅读电子邮件时,有 58 个。

尝试在电子邮件中包含 $lines 的值,您会看到。

或者尝试使用/proc/*/cmdline,可能更可靠。

【讨论】:

    【解决方案3】:

    grep httpd 查找名称中包含 httpd 的所有进程,可能包括 grep httpd 本身,也可能包括其他进程。

    【讨论】:

    • 您可以使用grep [h]ttpdgrep 排除在外。
    【解决方案4】:

    "ps -ef|grep httpd" 不只是找到 httpd 进程,是吗?它会查找在 ps 中的完整 (-f) 列表中包含字符串“httpd”的进程。

    【讨论】:

      【解决方案5】:

      这可能无法解决您的问题,但您可以改用pgrep 来简化事情。

      【讨论】:

      • 是的!这比 grepping ps 输出更容易、更可靠。
      【解决方案6】:

      您也可以这样做,将 grep 和 wc 的使用减少到一个 awk。

      ps -eo args|awk '!/awk/&&/httpd/{++c}
      END{
          if (c>60){
              cmd="mailx -s \047Over 60\047 root"
              cmd | getline
          }
      }'
      

      【讨论】:

        猜你喜欢
        • 2011-06-29
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多