2013-12-19 60 views
1

我们在环境中有大约300台服务器(AIX,HP-UX,Suse Linux,RHEL,Solaris),这使得很难检查名为syslog的进程是否正在这些服务器上运行,单独。用于检查进程的Shell脚本

因此,我正在开发一个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' 
+1

替换'用单引号的ssh -l root'反引号。 –

+0

也从您的进程列表中过滤grep。 'ps -ef | | grep -ve grep' | awk'{print $ 9}'。您也可以使用-e将多个正则表达式传递给grep。 grep -ve pts -ve super -ie syslog。有些greps会将所有参数视为不区分大小写,而不管其中的-i落在哪里,所以如果它很重要,请将其分开。 – JimR

+0

300台服务器,这将是一个像[nagios.org](http://www.nagios.org)监控应用程序? – PeterMmm

回答

0

最后,找到了一种方法来拔出过程中的文本文件。请参阅下面的代码。

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 
0

为什么所有这一切?

如果您安装了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连接从我的主机上被允许,就可以工作

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 
+0

你好? user3002491 – Vahid

+0

这是一个生产环境,我不允许玩弄进入服务器的新方法。我们所拥有的只是服务器中的公钥和本地机器中的私钥,当我们输入“ssh -l root ”时,它会将我们认证到主机中。我感谢你的帮助,但它会更好,如果你能帮助我固定在上面的命令给输出一样, - syslog-ng的 - 在文本编辑器的syslogd 。 - 谢谢 – Avinash