用于查找apache服务器的Bash脚本

时间:2013-09-27 23:23:01

标签: apache bash solaris

如果我没有正确地搜索每一个可能的帖子,我道歉,但所有看起来都有点不同,我开始越过眼睛看着这个。

以下bash代码是我到目前为止所拥有的。

for server in `cat serverlist2.txt`; do ssh -q $server 
    if ! ps -ef | grep -q http ; then 
        echo $server
    fi
done

我是bash脚本的新手,我必须找到运行apache(http)的文件serverlist2.txt中列出的所有主机,然后打印找到http的主机名。任何帮助将不胜感激。

2013年9月29日更新

for server in `cat serverlist2.txt`; do
    ssh -q $server "ps -ef | grep http |grep -v grep && echo $server | wc -l"
done      

以上更改,这是输出。

bash-3.00# bash serverlist.sh  
resin  9900   612   0   Jul 30 ? 0:00 perl /usr/local/resin-pro-3.0.25/bin/wrapper.pl -chdir -name httpd -class com.c 1      
resin 18053   641   0   Jul 30 ?  0:00 perl /usr/local/resin-pro-3.0.25/bin/wrapper.pl -chdir -name httpd -class com.c 1  
resin  1768   589   0   Apr 10 ? 0:00 perl /var/resin/wss-stg/bin/wrapper.pl -chdir -name httpd -class com.caucho.ser 1  
resin  8568 13119   0   Sep 23 ?  0:00 perl /usr/local/resin-pro-3.0.25/bin/wrapper.pl -chdir -name httpd -class com.c   1  
resin  1062   776   0   Sep 16 ?  0:00 perl /usr/local/resin-pro-3.0.25/bin/wrapper.pl -chdir -name httpd -class com.c 1  
resin  3539  8290   0   Jul 13 ?  0:00 perl /usr/local/resin-pro-3.0.25/bin/wrapper.pl -chdir -name httpd -class com.c 1  
resin 29900  3391   0   Sep 23 ?  0:00 perl /var/resin/wss-prod/bin/wrapper.pl -chdir -name httpd -class com.caucho.se 1  
resin 21323  8547   0   Sep 23 ?  0:00 perl /var/resin/wss-prod/bin/wrapper.pl -chdir -name httpd -class com.caucho.se 1  
bash-3.00#  

1 个答案:

答案 0 :(得分:1)

我想你想做这样的事情:

while read server; do
    ssh -q $server "ps -ef | grep http | grep -v grep >/dev/null && echo $server"
done < serverlist2.txt

即,对于列表中的每个服务器:

  • 使用ps -ef
  • 获取所有流程的列表
  • 按“http”
  • 一词过滤
  • 排除任何匹配的grep http行,但不打印任何内容
  • 如果匹配,则回显服务器名称

那说......对“http”的进程列表进行点击不是很准确,你可能会得到误报。更好的解决方案是使用某种状态命令。例如,在Debian系统中,您可以像这样检查apache2的状态:

service apache2 status

如果服务器正在运行,这将退出0(=成功),如果未运行,则退出1(=失败)。使用此脚本变为:

while read server; do
    ssh -q $server "service apache2 && echo $server"
done < serverlist2.txt

如果你有混合系统,一些Debian,一些RedHat,一些Solaris等,那么检查状态的方法可能因服务器而异。您可以通过创建脚本来解决这个问题,让我们称之为具有智能的httpstatus.sh来确定它运行的系统类型(例如,基于uname),并充当公共包装器,如果Web服务器正在运行,则退出0;如果未运行,则退出1。然后脚本变为:

while read server; do
    ssh -q $server "httpstatus.sh && echo $server"
done < serverlist2.txt