200個のhttp URLのステータスをチェックして、リンク切れの原因を特定する必要があります。リンクは単純なテキストファイルに存在します(たとえば、〜フォルダーに存在するURL.txt)。私はUbuntu 14.04を使用していますが、Linux初心者です。しかし、私はbashシェルが非常に強力であり、私が望むものを達成するのを助けることができることを理解しています。
私の正確な要件は、URLのリストが含まれているテキストファイルを読み取り、リンクが機能しているかどうかを自動的に確認し、URLとそれに対応するステータス(動作中/破損)を含む新しいファイルに応答を書き込むことです。
「checkurls.sh」というファイルを作成して、urls.txtファイルもあるホームディレクトリに配置しました。私は使用してファイルに実行権限を与えました
$chmod +x checkurls.sh
Checkurls.shの内容を以下に示します。
#!/bin/bash
while read url
do
urlstatus=$(curl -o /dev/null --silent --head --write-out '%{http_code}' "$url" )
echo "$url $urlstatus" >> urlstatus.txt
done < $1
最後に、コマンドラインから次のように実行しました-
$./checkurls.sh urls.txt
出来上がり!できます。
#!/bin/bash
while read -ru 4 LINE; do
read -r REP < <(exec curl -IsS "$LINE" 2>&1)
echo "$LINE: $REP"
done 4< "$1"
使用法:
bash script.sh urls-list.txt
サンプル:
http://not-exist.com/abc.html
https://kernel.org/nothing.html
http://kernel.org/index.html
https://kernel.org/index.html
出力:
http://not-exist.com/abc.html: curl: (6) Couldn't resolve Host 'not-exist.com'
https://kernel.org/nothing.html: HTTP/1.1 404 Not Found
http://kernel.org/index.html: HTTP/1.1 301 Moved Permanently
https://kernel.org/index.html: HTTP/1.1 200 OK
すべてについて、 Bash Manual をお読みください。見る man curl
、help
、man bash
同じように。
受け入れられたソリューションにいくつかの並列処理を追加するのはどうでしょうか。スクリプトを変更してみましょうchkurl.sh
読みやすく、一度に1つの要求のみを処理するために:
#!/bin/bash
URL=${1?Pass URL as parameter!}
curl -o /dev/null --silent --head --write-out "$URL %{http_code} %{redirect_url}\n" "$URL"
そして今あなたはあなたを使ってあなたのリストをチェックします:
cat URL.txt | xargs -P 4 -L1 ./chkurl.sh
これにより、ジョブを最大4倍速く完了できます。
これで、引数として渡されたファイルにリストされているURLをチェックする私の完全なスクリプト(例: 「checkurls.sh listofurls.txt」。
それがすること:
コード:
#!/bin/sh
EMAIL=" [email protected]"
DATENOW=`date +%Y%m%d-%H%M%S`
LOG_FILE="checkurls.log"
c=0
while read url
do
((c++))
LOCK_FILE="checkurls$c.lock"
urlstatus=$(/usr/bin/curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --write-out '%{http_code}' "$url" )
if [ "$urlstatus" = "200" ]
then
#echo "$DATENOW OK $urlstatus connection->$url" >> $LOG_FILE
[ -e $LOCK_FILE ] && /bin/rm -f -- $LOCK_FILE > /dev/null && /bin/mail -s "NOTIFICATION URL OK: $url" $EMAIL <<< 'The URL is back online'
else
echo "$DATENOW FAIL $urlstatus connection->$url" >> $LOG_FILE
if [ -e $LOCK_FILE ]
then
#no action - awaiting URL to be fixed
:
else
/bin/mail -s "NOTIFICATION URL DOWN: $url" $EMAIL <<< 'Failed to reach or URL problem'
/bin/touch $LOCK_FILE
fi
fi
done < $1
# REMOVE LOG FILE IF LARGER THAN 100MB
# alow up to 2000 lines average
maxsize=120000
size=$(/usr/bin/du -k "$LOG_FILE" | /bin/cut -f 1)
if [ $size -ge $maxsize ]; then
/bin/rm -f -- $LOG_FILE > /dev/null
echo "$DATENOW LOG file [$LOG_FILE] has been recreated" > $LOG_FILE
else
#do nothing
:
fi
テキストファイル内のリストされたURLの順序を変更すると、既存のロックファイルに影響することに注意してください(混乱を避けるために、すべての.lockファイルを削除してください)。ファイル名としてurlを使用することで改善されますが、次のような特定の文字:@ /? &オペレーティングシステムで処理する必要があります。
入力ファイルに1行あたり1つのURLが含まれている場合は、スクリプトを使用して各行を読み取ってから、URLにpingを実行できます。pingが成功した場合、URLは有効です。
#!/bin/bash
INPUT="Urls.txt"
OUTPUT="result.txt"
while read line ;
do
if ping -c 1 $line &> /dev/null
then
echo "$line valid" >> $OUTPUT
else
echo "$line not valid " >> $OUTPUT
fi
done < $INPUT
exit
pingオプション:
-c count
Stop after sending count ECHO_REQUEST packets. With deadline option, ping waits for count ECHO_REPLY packets, until the timeout expires.
このオプションを使用して待機時間を制限することもできます
-W timeout
Time to wait for a response, in seconds. The option affects only timeout in absense
of any responses, otherwise ping waits for two RTTs.