介紹
我希望在ubuntu服務器上部署的nginx + uwsgi應用,運行出現(xiàn)錯誤時我能盡快知道并解決。應用運行中,運行日志保存在/tmp/ypk.log文件中,若出新錯誤,日志中會寫入如DataError: invalid input syntax for type date: "3年"……類似記錄。我的思路是定時掃描這個日志文件,如果出現(xiàn)新的Error關鍵字,就將相關的信息發(fā)至我的郵箱。這樣的任務,非Shell腳本語言不能實現(xiàn)。
Shell腳本語言介紹
Shell腳本,又稱Shell命令稿、程序化腳本,是一種電腦程序與文本文件,內容由一連串的shell命令組成,經(jīng)由Unix Shell直譯其內容后運作。被當成是一種腳本語言來設計,其運作方式與直譯語言相當,由Unix shell扮演命令行解釋器的角色,在讀取shell腳本之后,依序運行其中的shell命令,之后輸出結果。利用shell腳本可以進行系統(tǒng)管理,文件操作等。在Unix及所有的類Unix系統(tǒng)中,如Linux、FreeBSD等操作系統(tǒng),都存在shell腳本。依照Unix shell的各種不同類型,shell腳本也有各種不同方言。在DOS、OS/2、Microsoft Windows中的批處理文件,跟shell腳本有類似的功能。
腳本中用到的命令
-
grep, Linux系統(tǒng)中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。 -
sendemail, 郵件發(fā)送工具,可以看這篇文章如何在ubuntu上使用sendemail發(fā)送郵件。 -
comm, 逐行比較兩個文件的內容。
腳本的程序流程

程序流程
腳本
#!/bin/bash
# 判斷ypk_error是否存在
if [ ! -e /tmp/ypk_error ]; then
# 如果不存在,在系統(tǒng)日志中搜索Error關鍵字,保存到文件ypk_error中
grep -n Error /tmp/ypk.log > /tmp/ypk_error
# 判斷 ypk_error 是否為空
if [ -s /tmp/ypk_error ]
then
# 非空,發(fā)送給系統(tǒng)管理員
sendemail -f 發(fā)件人地址 -t 管理員郵箱 -u "ypk error log" -s smtp服務器 -o tls=yes -xu 用戶名 -xp 密碼 -m < /tmp/ypk_error
fi
# 如果ypk_error文件已經(jīng)存在
else
# 與新生成文件比較,比較結果寫入diff文件
comm -23 <(grep -n Error /tmp/ypk.log) /tmp/ypk_error > /tmp/diff
if [ -s /tmp/diff ]
then
# 如果比較結果非空,則發(fā)送
sendemail -f 發(fā)件人地址 -t 管理員郵箱 -u "ypk error log" -s smtp服務器 -o tls=yes -xu 用戶名 -xp 密碼 -m < /tmp/diff
# 生成新的ypk_error文件
grep -n Error /tmp/ypk.log > /tmp/ypk_error
fi
fi
設為定時運行
編輯ubuntu crontab定時腳本:
crontab -e
設為每小時的30分執(zhí)行一次:
30 * * * * /home/user/send_ypk_err.sh
運行結果

2017-12-26 16-06-23屏幕截圖.png
OK。
本文參考了這篇文章。