0

このスクリプトを作成して、異なるサーバーからの wget を相互に自動化し、結果をログ ファイルに出力してメールで送信しました。これを共有する理由の 1 つは、他の人が自分でソリューションを使用できるようにするためです。

ファイルを 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

メールは次のようになります

件名: Servername Wget Results v.2.0 Sendmail 09/09/12 ---- 日曜日 04:59:21 (MSK) ::: 第 36 週


WGETスケジュール


2012 年 9 月 9 日 04:52:00 の WGETS スケジュールの開始

サーバー #1 xxx.xxxxxx.com|ip.ip.ip.ip|:80 に接続しています... 接続されました。長さ: 104857600 (100M) [テキスト/プレーン] 102350K .. ..........100% 5.73M 0s 102400K 100% 0.00 =25s 2012-09-09 04:52:27 (4.07 MB/s) - `/dev/null' 保存 [104857600/ 104857600] . .


2012 年 9 月 9 日 04:59:21 の WGETS スケジュールの終了


したがって、私の /var/log は、例のファイル名として wordpress-wget-SUMMARY-sep24_2012.log などのファイルを保存することになります。問題はそれが問題になりつつあり、サーバーが変更されることを維持することです。そのため、サーバーリストを1か所で更新し、それらをすべて自分で処理できるようにしたいと思います。実行前に新しいservers.listをダウンロードし、残りは完了です。

メールは機能しており、ログ ファイルへの出力は機能しており、すべて機能しており、微調整が必​​要なだけです。

タイ!タイ!読むためのタイ。

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 に答える