用于检查进程的Shell脚本

时间:2013-12-19 06:33:35

标签: linux bash shell process monitoring

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

因此,我正在开发一个shell脚本,该脚本应该从我的Linux开放客户端Lenovo Thinkpad以root身份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笔记本电脑终端的$ prompt。

   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'

2 个答案:

答案 0 :(得分: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连接,就可以将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

答案 1 :(得分: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