公司産品線有一個公用的挂載盤,主要是用來友善各位開發人員去放置他們自己的一些工作材料,比如異常的日志或者tcpdump的抓包等等雜七雜八的東西,但是這個挂載盤由于使用人衆多,容量自然要有監控,于是就有了寫這個腳本的動機。
在這裡我寫了兩個腳本,上面這個是用來監控磁盤容量,然後通過#df -h的排序生成前十名占容量最大的檔案夾,把這個檔案夾的名字和對應的大小重定向到一個叫alarm.txt這個檔案裡,這個檔案就是郵件正文。然後在确定他們的主人,統一加上公司郵箱字尾來得到他們主人的郵箱位址,最後對應他們各自的郵箱位址用下面那個腳本來發送檔案夾容量過高的郵件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<code>#!/usr/bin/env python</code>
<code># coding=utf-8</code>
<code>import</code> <code>os</code>
<code>import</code> <code>AutoMail</code>
<code>import</code> <code>commands</code>
<code>#設定變量判斷是否挂載和挂載盤的容量</code>
<code>mount </code><code>=</code> <code>commands.getoutput(</code><code>"mount | grep ':.*nfs'|wc -l"</code><code>)</code>
<code>size </code><code>=</code> <code>commands.getoutput(</code><code>"df -h | grep share | awk '{print $5}' | cut -d '%' -f 1"</code><code>)</code>
<code>##建立發郵件的文本檔案</code>
<code>def</code> <code>Createalarm():</code>
<code> </code><code>if</code> <code>os.path.exists(</code><code>'/root/chenscript/alarm.txt'</code><code>) </code><code>=</code><code>=</code> <code>True</code><code>:</code>
<code> </code><code>os.system(</code><code>"python /root/chenscript/weixin_sharealarm.py"</code><code>)</code>
<code> </code><code>print</code> <code>(</code><code>"微信告警已經發送!"</code><code>)</code>
<code> </code><code>os.system("cd </code><code>/</code><code>root</code><code>/</code><code>chenscript; echo 'share盤容量大于</code><code>80</code><code>%</code><code>,現在将調出容量排名前十位的檔案</code>
<code>夾名字及對應的容量,請各位處理一下不需要的檔案!' ></code><code>/</code><code>root</code><code>/</code><code>chenscript</code><code>/</code><code>alarm.txt")</code>
<code> </code><code>os.system(</code><code>"cd /挂載盤名稱 ;du -s * --exclude='不想要計算在内的檔案夾' --exclude='不想要計算在内的檔案夾' --exclude='不想要計算在内的檔案夾'|sort -nr |head >>/root/chenscript/alarm.txt"</code><code>)</code>
<code> </code><code>os.system(</code><code>"echo '\n' >> /root/chenscript/alarm.txt"</code><code>)</code>
<code> </code><code>if</code> <code>os.path.exists(</code><code>'/root/chenscript/alarm.txt'</code><code>) </code><code>=</code><code>=</code> <code>False</code><code>:</code>
<code> </code><code>os.system(</code><code>"cd /root/chenscript;touch alarm.txt"</code><code>)</code>
<code>def</code> <code>Sendmail():</code>
<code> </code><code>fp </code><code>=</code> <code>open</code><code>(</code><code>'/root/chenscript/alarm.txt'</code><code>, </code><code>'r'</code><code>)</code>
<code> </code><code>content </code><code>=</code> <code>fp.read()</code>
<code> </code><code>AutoMail.send_mail(</code><code>'share挂載盤容量大于80%!收到郵件的各位請整理自己對應的檔案夾!'</code><code>, content)</code>
<code>#将郵件的檔案重新整理</code>
<code>def</code> <code>Dellist():</code>
<code> </code><code>os.system(</code><code>"cd /root/chenscript/;rm -f alarm.txt;touch alarm.txt"</code><code>)</code>
<code>if</code> <code>mount </code><code>=</code><code>=</code> <code>'1'</code> <code>and</code> <code>size ></code><code>=</code> <code>'80'</code><code>:</code>
<code> </code><code>print</code> <code>(</code><code>"挂載盤存在!"</code><code>)</code>
<code> </code><code>print</code> <code>(</code><code>"share盤容量大于80%..."</code><code>)</code>
<code> </code><code>Createlist()</code>
<code> </code><code>Sendmail()</code>
<code> </code><code>Dellist()</code>
<code>elif</code> <code>mount </code><code>=</code><code>=</code> <code>'1'</code> <code>and</code> <code>size < </code><code>'80'</code><code>:</code>
<code> </code><code>print</code> <code>(</code><code>"share盤容量正常..."</code><code>)</code>
<code>else</code><code>:</code>
<code> </code><code>print</code> <code>(</code><code>"挂載盤不存在,現在重新挂載..."</code><code>)</code>
<code> </code><code>os.system(</code><code>"mount -t nfs -o acl,rw,intr,soft,nolock,rsize=8192,wsize=8192 10.160.43.172:/share /share "</code><code>)</code>
<code>#coding=utf-8</code>
<code>#這個腳本的用途是用來發送郵件</code>
<code>import</code> <code>smtplib</code>
<code>from</code> <code>email.mime.multipart </code><code>import</code> <code>MIMEMultipart</code>
<code>from</code> <code>email.mime.text </code><code>import</code> <code>MIMEText</code>
<code>from</code> <code>email.mime.application </code><code>import</code> <code>MIMEApplication</code>
<code>mailto_list</code><code>=</code><code>[] </code><code>#這裡為空list,會從list.txt裡一行一行的當做元素添加進來</code>
<code>#生成list.txt</code>
<code>if</code> <code>os.path.exists(</code><code>'/root/chenscript/list.txt'</code><code>) </code><code>=</code><code>=</code> <code>True</code><code>:</code>
<code> </code><code>os.system(</code><code>"cd /挂載盤名稱;du -s * --exclude='不想要計算在内的檔案夾' --exclude='不想要計算在内的檔案夾' --exclude='不想要計算在内的檔案夾'|sort -nr |head|awk \'{print $2\"@dahuatech.com\"}\' >>/root/chenscript/list.txt"</code><code>)</code>
<code>if</code> <code>os.path.exists(</code><code>'/root/chenscript/list.txt'</code><code>) </code><code>=</code><code>=</code> <code>False</code><code>:</code>
<code> </code><code>os.system(</code><code>"cd /root/chenscript/;rm -f list.txt;echo '本人的郵箱位址'>list.txt"</code><code>)</code>
<code>with </code><code>open</code><code>(</code><code>'/root/chenscript/list.txt'</code><code>,</code><code>'r'</code><code>) as f:</code>
<code> </code><code>f</code><code>=</code><code>f.readlines()</code>
<code>for</code> <code>i </code><code>in</code> <code>f:</code>
<code> </code><code>i</code><code>=</code><code>i.strip(</code><code>'\n'</code><code>)</code>
<code> </code><code>mailto_list.append(i)</code>
<code>mail_host</code><code>=</code><code>"這裡填寫郵箱主機"</code>
<code>mail_user</code><code>=</code><code>"這裡填寫發送人的郵箱位址"</code>
<code>mail_pass</code><code>=</code><code>"發送人的郵箱密碼"</code>
<code>mail_postfix</code><code>=</code><code>"dahuatech.com"</code>
<code>mail_sender</code><code>=</code><code>"與mail_host内容相同"</code>
<code>def</code> <code>send_mail(sub, content):</code>
<code> </code><code>me</code><code>=</code><code>mail_sender</code>
<code> </code><code>msg </code><code>=</code> <code>MIMEMultipart()</code>
<code> </code><code>msg[</code><code>'Subject'</code><code>] </code><code>=</code> <code>sub</code>
<code> </code><code>msg[</code><code>'From'</code><code>] </code><code>=</code> <code>me</code>
<code> </code><code>msg[</code><code>'To'</code><code>] </code><code>=</code> <code>";"</code><code>.join(mailto_list)</code>
<code> </code><code>content1 </code><code>=</code> <code>MIMEText(</code><code>str</code><code>(content), </code><code>'plain'</code><code>, </code><code>'utf-8'</code><code>)</code>
<code> </code><code>msg.attach(content1)</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>s </code><code>=</code> <code>smtplib.SMTP()</code>
<code> </code><code>s.connect(mail_host)</code>
<code> </code><code>s.login(mail_user,mail_pass)</code>
<code> </code><code>s.sendmail(me, mailto_list, msg.as_string())</code>
<code> </code><code>print</code><code>(</code><code>'發送成功!\n'</code><code>)</code>
<code> </code><code>s.close()</code>
<code> </code><code>except</code> <code>Exception as e: </code><code>print</code><code>(</code><code>str</code><code>(e))</code>
<code>os.system(</code><code>"cd /root/chenscript/;rm -f list.txt;echo '我本人的郵件位址'>list.txt"</code><code>)</code>
執行的效果如下:
<a href="https://s4.51cto.com/wyfs02/M00/06/98/wKiom1m6i9azyByDAABqTWMs_tc175.png" target="_blank"></a>
隐藏的知識點!
1)#du -s 是按照位元組來統計,“--exclude='yunwei'”是在排序的時候忽略掉yunwei這個檔案夾,容後再用#sort -nr|head是得到從大到小前10名,如果得到後10名就是#sort -nr|tail;
2)如果使用的是import commands,那麼commands.getoutput得到的是字元串!
3)用#mount | grep ':.*nfs'來判斷挂載盤是否存在是一個很簡單的方式,如果挂了多個,就用ip in的方式來進一步判斷;
4)python要一行一行的讀取檔案,就readline;
5)python按行讀取檔案,去掉換行符"\n"的方法:
<code>for</code> <code>line </code><code>in</code> <code>file</code><code>.readlines():</code>
<code> </code><code>line</code><code>=</code><code>line.strip(</code><code>'\n'</code><code>)</code>
6)import Automail的時候,就已經把Automail.py這個腳本固定住了,這時候mailto_list已經不能變化了,是以要把添加list.txt放到這個腳本裡。
<a href="https://s1.51cto.com/wyfs02/M01/A5/55/wKioL1m7fySQp5JcAABIF2LnuDk553.png" target="_blank"></a>
發了郵件,連吼帶罵一頓,終于把share盤容量下降到了69這樣一個美妙的數字...
最後的最後,如果您覺得本文對您升職加薪有幫助,那麼請不吝贊助之手,刷一下下面的二維碼,贊助本人繼續寫更多的博文!
本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1965358