【发布时间】: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,你有太多grep和awk陈述。但实际上,有一百万种监控工具可以更好地做到这一点,即使没有,您也可以在每台主机上运行 cronjobs 并将它们全部通过管道传输到某个主机上的一个位置或数据库。 -
为什么不用New relic、munin等监控工具呢?如果您发现它们超出范围,请使用 SeaLion 之类的东西。检查此link 以获得要点。这将简化您的任务。
标签: linux bash shell process monitoring