【问题标题】:Shell Script for checking processes用于检查进程的 Shell 脚本
【发布时间】:2013-12-19 06:33:34
【问题描述】:

我们的环境中有大约 300 台服务器(AIX、HP-UX、Suse Linux、RHEL、Solaris),因此很难单独检查一个名为 syslog 的进程是否在这些服务器中运行。

因此,我正在开发一个 shell 脚本,它应该以 root 身份从我的 Linux 开放客户端 Lenovo Thinkpad SSH 并执行 ps -ef 命令并在文本文件中返回输出。

for i in `cat /tmp/serverlist |awk '{ print $1 }'`
do
    ssh -l root $i `bash -x ./sysloginfo.sh` >>syslogdata.txt
done

脚本文件 sysloginfo.sh 包含以下内容:

for i in `ps -ef |grep -i syslog |grep -v pts |grep -v super |awk '{ print $9 }'`
do
    echo "`uname -n`" $i "\n" 
done

现在,当我执行命令时,它会为所有服务器一一显示以下内容,并返回我的 Linux 笔记本电脑终端的 $ 提示符。

   bash: xxxxxx.xxxx.com: command not found
   ++ ps -ef
   ++ grep -i syslog
   ++ grep -v pts
   ++ grep -v super
   ++ awk '{ print $9 }'
   + for i in '`ps -ef |grep -i syslog |grep -v pts |grep -v super |awk '\''{ print $9 }'\''`'
   ++ uname -n
   + echo oc7057073017.ibm.com -i '\n'
   + for i in '`ps -ef |grep -i syslog |grep -v pts |grep -v super |awk '\''{ print $9 }'\''`'
   ++ uname -n
   + echo xxxxxx.xxxx.com: --start '\n'

【问题讨论】:

  • 用单引号替换ssh -l root 中的反引号。
  • 也将 grep 从您的进程列表中过滤出来。 ps -ef | <your stuff> | grep -ve grep | awk '{打印 $9}'。您还可以使用 -e 将多个正则表达式传递给 grep。 grep -ve pts -ve super -ie 系统日志。一些 grep 会将所有参数视为不区分大小写,无论 -i 落在哪里,因此如果重要,请将其分开。
  • 300 台服务器,这将是一个像nagios.org 这样的监控应用程序?
  • 几件事,你不需要以root身份运行,你不应该在任何地方使用cat,你有太多grepawk陈述。但实际上,有一百万种监控工具可以更好地做到这一点,即使没有,您也可以在每台主机上运行 cronjobs 并将它们全部通过管道传输到某个主机上的一个位置或数据库。
  • 为什么不用New relic、munin等监控工具呢?如果您发现它们超出范围,请使用 SeaLion 之类的东西。检查此link 以获得要点。这将简化您的任务。

标签: linux bash shell process monitoring


【解决方案1】:

为什么要这么做?

如果您安装了 snmp - 使用 SNMP 查询所有远程主机而无需任何 SSH,我会尽力提供帮助并为您指明正确的方向:

snmpwalk -v2c -c public localhost 1.3.6.1.2|grep -i syslog
HOST-RESOURCES-MIB::hrSWRunName.1171 = STRING: "rsyslogd"
HOST-RESOURCES-MIB::hrSWRunPath.1171 = STRING: "/sbin/rsyslogd"
HOST-RESOURCES-MIB::hrSWRunParameters.1171 = STRING: "-i /var/run/syslogd.pid -c 5"
HOST-RESOURCES-MIB::hrSWRunParameters.15145 = STRING: "-i syslog"
HOST-RESOURCES-MIB::hrSWInstalledName.392 = STRING: "rsyslog-5.8.10-6.el6"

这些都是本机snmp相关的东西

现在运行这组特定的 snmpwalk 命令,我可以在本机上查明 pid,但是只要密码是公开的并且允许从我的主机进行 snmp 连接,就可以将 localhost 更改为远程主机,那么这应该可以工作

snmpwalk -v2c -c public -Oq localhost HOST-RESOURCES-MIB::hrSWRunName|grep syslog
HOST-RESOURCES-MIB::hrSWRunName.1171 "rsyslogd"


 snmpwalk -v2c -c public -Oq localhost HOST-RESOURCES-MIB::hrSWRunName|grep syslog|awk -F"hrSWRunName." '{print $2}'|awk -F" " '{print $1}'
1171

pid 是 1171

ps auwx|grep 1171
root      1171  0.0  0.0 249276  1820 ?        Sl   Nov20   0:03 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

【讨论】:

  • 这是一个生产环境,我不被允许玩弄进入服务器的新方法。我们所拥有的只是服务器中的公钥和本地机器中的私钥,当我们输入“ssh -l root ”时,它会向主机验证我们的身份。感谢您的帮助,但如果您能帮助我修复上述命令以在文本编辑器中提供类似 - syslog-ng - syslogd 的输出,那就更好了。 - 谢谢
  • 所以,ssh -l root <hostname> snmpwalk [options] localhost HOST-RESOURCES-MIB::hrSWRunName|grep syslog。当您将 VH 的推荐简单地转换并尝试它时发生了什么?
【解决方案2】:

最后,找到了一种在文本文件中提取进程的方法。请参考下面的代码。

    for i in `cat /tmp/serverlist`
    do
    echo $i:`ssh -l root $i "uname -n;ps -eo comm | grep -i syslog"` >> sysloginfo.txt
    done

这给出了一个输出,

    xx.xx.xx.xx: xxxxxxx101 syslogd
    xx.xx.xx.xx: xxxxxxx102 syslog-ng
    xx.xx.xx.xx: xxxxxxx103
    xx.xx.xx.xx: xxxxxxx104 syslog-ng syslog-ng 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2014-12-11
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多