2013-09-27 71 views
1

我很抱歉,如果我没有正确地搜索每一个可能的帖子,但都看起来有点不同,我开始交叉眼睛看着这个。bash脚本来查找apache服务器

下面的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找到该主机名。任何帮助将不胜感激。

更新13年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

我觉得你想要做这样的事情:

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 lin ES,但没有打印出任何东西
  • 如果有匹配的,回声服务器

也就是说...... grepping进程列表中的“HTTP”不是很准确的名字,你可能会得到错误的阳性。更好的解决方案是使用某种状态命令。例如,在Debian的系统,可以检查apache2这样的状态:如果服务器正在运行,如果没有运行

service apache2 status 

这将0(=成功)退出和1(=故障)。使用这个脚本变为:

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

如果您有混合的系统,一些Debian的,有些红帽,某些Solaris等,则该方法检查状态,从服务器到服务器可能不同。你可以通过创建一个脚本来解决这个问题,我们称它为httpstatus.sh,它具有智能来确定它正在运行的系统的类型(例如,基于uname),并作为通用包装器,如果Web服务器正在运行,如果没有运行,则为1。然后,脚本变为:

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

或ssh -q $服务器“/etc/init.d/apache2状态” – inselberg

+0

我应该指出,其阳光OS 10 ..使用服务引发除了没有找到命令的服务。 –

+0

不完全。第一个使用grep -q命令引发错误。所以我删除它,它只是完成没有任何输出。 –