在Bash中从列表中获取真正的输入

时间:2018-01-22 14:31:41

标签: linux bash while-loop

我正在寻找一个带有while循环的替代方案,它应该从一个文件中检索输入。即使我没有用真实条件解释这一点,在这种情况下,我无法从像(cat filename)这样的文件中提供变量,

我的要求是每隔5分钟通过ping测试检查100台服务器是否已启动,并将其记录到某个自定义位置(让我们说/tmp/output/out-`date +%F`)。并且相同的脚本应该在7天后删除相同的日志,并且每个文件大小的最大大小不超过1MB。

while read IP
do
ping -c1 $IP &> /dev/null && echo $IP is up  || echo $IP is down
sleep 2
done < IP

注意:要在无限循环中运行此脚本,我无法将输入解析为文件中的变量。

while true
do 
...
done < filename

赞赏的想法:)

1 个答案:

答案 0 :(得分:1)

多个任务并行运行:

#!/bin/bash

t=5m                             # time interval
p=()                             # pid list

_pingAndLog(){                   # $1 is the server ip list
  local ip
  while :; do
    while read -r ip || [[ -n $ip ]]; do
      if ping -c1 $ip >/dev/null 2>&1; then
        echo "`date +%H:%M`: $ip is up"
      else
        echo "`date +%H:%M`: $ip is down"
      fi >>pingtest-`date +%F`.log
    done <"$1"                   # $1 = ip list
    sleep "$t"
  done
}

_killOldLog(){
  while :; do
    # use "-mtime +7" to find old files, 7 days
    find . -type f -mtime +7 -name 'pingtest-*\.log' -delete
    sleep 24h
  done
}

_cleanUp(){
  echo kill ${p[@]}
  kill ${p[@]}
}

for s in *\.list; do             # for each file ip list
  [[ "$s" = '*.list' ]] && break # no file found, then quit
  _pingAndLog "$s" & p+=($!)     # run in background, remember pid
done
_killOldLog & p+=($!)

trap _cleanUp 0 2 3              # 0-exit; 2-interrupt, 3-quit

wait                             # wait backround jobs; Ctrl-C to exit

注意:

  1. 由于日志文件按日期分隔,因此可能无需检查其大小;只删除那些旧的。
  2. while sleep "$t"; do .. done也可以根据需要构建无限循环。
  3. 我修改了这个脚本,以便它可以并行ping多个IP列表。