0

我编写了这个脚本来自动化我不同服务器之间的 wget,并将结果输出到日志文件,然后通过电子邮件将它们发送给我。我分享这个的部分原因是为了让其他人可以自己使用这个解决方案。

我已将文件放在 cron.weekly 中,因此它每周都会向我发送电子邮件。

顺便提一句。我是一个绝对的新手,这是我从这个网站学习编写的第一个脚本。

脚本如下:我也做了一些小评论。

#!/bin/sh
#wget -verbose -tries -timeout -dontcreatedirectories -dontsaveanything  http://x  output text to file

# automating apt-get update and upgrade so it runs weekly
apt-get update
apt-get upgrade -y

# this is where the logs will be stored
cd /var/log

# create a tmp file and if it is left behind from earlier results, empty it out
echo -e "\n" > wget.tmp

# these are the header texts for the results 
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "WGET SCHEDULES" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

# this will make note of the time the tests are started
date "+START OF WGETS SCHEDULE at %c"  >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "\n" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "\n" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

# up to 10 servers to wget from
echo "Server #1" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
wget -v -r -t 2 -T 7 -nd -O /dev/null http://servername/file 2>> wget.tmp
grep -i 'Length\|connect\|100%\|saved\|failed\|Error' wget.tmp >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
rm -f wget.tmp
echo "\n" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

. 一直持续到 。

echo "Server #10" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
wget -v -r -t 2 -T 7 -nd -O /dev/null http://servername/file 2>> wget.tmp
grep -i 'Length\|connect\|100%\|saved\|failed\|Error' wget.tmp >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
rm -f wget.tmp
echo "\n" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

# record the end time of tests
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
date "+END OF WGETS SCHEDULE at %c"  >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

#mail results to yourself
echo "Subject: $(hostname -s| tr a-z A-Z)"  Wget Results v.2.0 Sendmail  "$(date +%x)"      ----   "$(date "+%A")"    "$(date "+%X")   ("$(date "+%Z")")  :::  Week "$(date "+%V")"  """ | cat -  $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log | /usr/lib/sendmail -t myemailaddress@host.x

理想情况下,我不想将自己限制在 x # 台服务器上,但只要文件 servers.list 中有文本(通过在文件名中包含“.”,我就可以将其存储在 cron.weekly 中并且不会被处理)。所以对于每台服务器,写服务器#,处理wget,输出到文件,grep到日志文件。最好将 servers.list 文件格式化

hostname filename store/to
.
.
hostname filename store/to

例子:

msn.robots.ua 100mb.test /dev/null
justme.cov ratings.xlsx  /srv/storage/latest

邮件看起来像

主题:服务器名 Wget 结果 v.2.0 Sendmail 09/09/12 ---- 星期日 04:59:21 (MSK) ::: 第 36 周


WGET 时间表


WGETS 开始时间为 2012 年 9 月 9 日星期日 04:52:00

服务器 #1 连接到 xxx.xxxxxx.com|ip.ip.ip.ip|:80... 已连接。长度:104857600 (100M) [text/plain] 102350K ......................................................................................................... .. ..........100% 5.73M 0s 102400K 100% 0.00 =25s 2012-09-09 04:52:27 (4.07 MB/s) - `/dev/null' 已保存 [104857600/ 104857600]。.


WGETS 计划于 2012 年 9 月 9 日星期日 04:59:21 结束


因此,我的 /var/log 最终将诸如 wordpress-wget-SUMMARY-sep24_2012.log 之类的文件存储为示例文件名。问题是维护它正在成为一个问题,服务器发生变化,所以我想只更新一个位置的服务器列表,让他们自己处理。在执行之前,它将下载新的 servers.list 并完成其余的工作。

邮件工作输出到日志文件工作正常,一切正常,只需要一点点调整。

泰!泰!Ty 阅读。

4

2 回答 2

1

如果我正确地重复了您的问题,那么您想要替换您只能做 10 台服务器并希望从文件中提取数据而不是在脚本中修复它(如果有任何变化)这一事实。基于该重复,这是我的建议:

在您的 server.list 文件中,| 分隔它,我将在代码片段之后解释原因。所以你的 server.list 文件看起来像:

msn.robots.ua|100mb.test|/dev/null
justme.cov|ratings.xlsx|/srv/storage/latest

通过此设置,您可以在 bash 脚本中放置一个 for 循环,中间有重复的代码,如下所示:

    for conf in $(cat server.list); do
        server=`echo $conf | cut -d"|" -f1;`
        filename=`echo $conf | cut -d"|" -f2;`
        storeto=`echo $conf | cut -d"|" -f3;`

        ... the rest of your code goes here using the above variables ...

    done

如果您在文件中使用空格作为分隔符,则每次迭代中的 $conf 将只是每个空格分隔的值,而不是获取行然后将其拆分。

使用 awk 可能有一种更优雅的方法来执行此操作,但这会起作用。

于 2012-09-24T04:52:37.633 回答
0

所以最终脚本现在看起来像这样

#!/bin/sh
#wget -verbose -tries -timeout -dontcreatedirectories -dontsaveanything  http://x  output text to file
# update and upgrade packages and packages list
apt-get update
apt-get upgrade -y

# go to location where logs will be stored and servers list is updated from list stored on master server
cd /var/log
rm -f server.list 
wget http://yourserver/server.list

# create a tmp file and if it is left behind from earlier results, empty it out
echo -e "\n" > wget.tmp

# these are the header texts for the results 
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "WGET SCHEDULES" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

# this will make note of the time the tests are started
date "+START OF WGETS SCHEDULE at %c"  >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
echo " " >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

### for loop to read from server.list file like this http://msn.robots.ua|100mb.test|/dev/null
wgetcount=0
for conf in $(cat server.list); do
        wgetcount=$((wgetcount+1)) 
        server=`echo $conf | cut -d"|" -f1;`
        filename=`echo $conf | cut -d"|" -f2;`
        storeto=`echo $conf | cut -d"|" -f3;`
        echo "Server # "$wgetcount >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
        wget -v -r -t 2 -T 7 -nd -O $storeto $server/$filename 2>> wget.tmp
        grep -i 'Length\|connect\|100%\|saved\|failed\|Error' wget.tmp >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
        rm -f wget.tmp
        echo " " >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
    done

# record the end time of tests
echo "***************" >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log
date "+END OF WGETS SCHEDULE at %c"  >> $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log

#mail results to yourself
echo "Subject: $(hostname -s| tr a-z A-Z)"  Wget Results v.2.0 Sendmail  "$(date +%x)"      ----   "$(date "+%A")"    "$(date "+%X")   ("$(date "+%Z")")  :::  Week "$(date "+%V")"  """ | cat -  $(hostname -s)"-wget-SUMMARY-"$(date "+%b%d_%Y" | tr A-Z a-z).log | /usr/lib/sendmail -t youremailaddress

相同的结果,可更新,更简洁和更短的代码;)))谢谢彼得

于 2012-09-27T14:38:04.873 回答