1

如果我没有正确搜索所有可能的帖子,我深表歉意,但所有帖子似乎都有点不同,我开始对这个问题感到眼花缭乱。

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

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

我是 bash 脚本的新手,我必须找到文件 serverlist2.txt 中列出的所有运行 apache (http) 的主机,然后打印找到 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#  
4

1 回答 1

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
于 2013-09-27T23:35:14.097 回答