一、脚本功能
(1)检查所有的builting_setting.h是否能够编译通过,并将编译结果写入 编译结果.h文件中。
(2)将编译结果通过邮箱发送给相关负责人。
(3)系统定期执行任务,检查build_setting。
二、发送邮件
1、要实现发邮件的功能,必须通过网站登陆设置开启SMTP服务和授权码,比如以下是163邮箱的设置过程。
2、在脚本此处设置邮箱的相关内容:(注意:邮箱密码必须是你启用的授权码)
三、crontab定时作业
(1)crontab -e:通过这个命令创建自己的定时作业
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数crontab -l //列出某个用户cron服务的详细内容crontab -r //删除某个用户的cron服务crontab -e //编辑某个用户的cron服务
* |代表任何时刻均可执行., |代表分隔时段,例如要在3:00和6:00两个时刻执行命令:```0 3,6 * * * command```- |代表范围,例如要在8:20,9:20,10:20三个时刻执行命令:```20 8-10 * * * command```/n |代表间隔,例如每10分钟执行一次命令:```*/10 * * * * command```注意时间与星期不能同时设置,例如下面就是一个错误的写法:
(2)启动crontab服务:service cron start
(3)关闭服务:service cron stop
(4)查看crontab服务:crontab -l
(5)删除定时作业:crontab -r
(6)查看crontab服务的状态:service cron status
如:每隔10MIN启动一次脚本
*/10 * * * * python /home/kk/share/bak/512_new/code/kitking/buildCheck.py
一般设置环境变量的时候,Linux会在/etc/profile里面配置,这样子用户登录,读取这个文件的时候就会读取到配置文件,所有正常的bash shell登录都可以执行我们的脚本。但是crontab就不一样了,在红帽系列的Linux上面,可以在/etc/crontab下发现有重新设置环境变量。
注意crontab运行是的环境变量需要手动添加:
cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed
手动添加如下:
四、脚本检查:
#!/usr/bin/python#_*_ coding:utf-8 _*_import timefrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email import Utils, Encodersfrom email.header import Headerimport mimetypesimport sysimport smtplibimport getoptimport osimport reimport shutilimport time, datetime'''脚本功能: (1)检查所有的builting_setting.h是否能够编译通过,并将编译结果写入 buildLog文件中。 (2)将编译结果通过邮箱发送给负责人。 (3)系统定期执行任务,检查build_setting。 注意:SRC的绝对路径更新:gPathSrc'''gPathSrc = u"/home/kk/share/bak/512_new/code"gPathBuildList = gPathSrc + u"/kitking/buildList.h"gPathBuildLog = gPathSrc + u"/kitking/buildLog.h"def SearchbinFile(curBuildName): global gPathSrc binFilepath = gPathSrc + "/mergedir" IsFindfile = 0 for filename in os.listdir(binFilepath): if (re.search(".*RR.*\.bin.*",filename)): IsFindfile = 1 break else: IsFindfile = 0 if IsFindfile == 0: if (os.path.isfile(gPathBuildList)): open(gPathBuildLog, "a").writelines(curBuildName) else: open(gPathBuildLog, "w").writelines(curBuildName)def Compile(): buildList = [] strCurBuildName = "" #查看清单文件 if(os.path.isfile(gPathBuildList)): buildList = open(gPathBuildList, "r").readlines() #无清单任务,需要重新产生 if(len(buildList) == 0): for dirPath, dirNames, fileNames in os.walk(gPathSrc + "/../BUILD_RECORD"): for strCurBuildName in dirNames: buildList.append(strCurBuildName+"\n") #每次移除一个任务后,更新清单文件 if(len(buildList)): strCurBuildName = buildList.pop() open(gPathSrc + "/../BUILD_RECORD/BUILD_NOW.h", "w").write("#define BUILD_NAME " + strCurBuildName) os.system(gPathSrc + "/build_history.sh") SearchbinFile(strCurBuildName) if (len(buildList)): open(gPathBuildList, "w").writelines(buildList) else: # 注意:附件的路径字符串应为unicode编码 # 发送者邮箱 接收者邮箱 邮箱密码 主题 内容 附件名 SendMail('rad_xxx@163.com', 'xxx@163.com', 'xxx','编译结果','请查看Log!',gPathBuildLog) os.remove(gPathBuildLog) os.remove(gPathBuildList)def SendMail(fromAddress, toAddress, usepassword,subject=None, content=None, attfile=None, \ subtype='plain', charset='utf-8'): username = fromAddress #创建一个带附件的实例 msg = MIMEMultipart() msg['From'] = fromAddress msg['To'] = toAddress if subject: #标题 msg['Subject'] = subject msg['Date'] = Utils.formatdate(localtime=1) if content: #添加邮件内容 txt = MIMEText(content, subtype, charset) msg.attach(txt) if attfile: #构造附件 #注意:传入的参数attfile为unicode,否则带中文的目录或名称的文件读不出来 # basename 为文件名称,由于传入的参数attfile为unicode编码,此处的basename也为unicode编码 basename = os.path.basename(attfile) #print basename #注意:指定att的编码方式为gb2312 att = MIMEText(open(attfile, 'rb').read(), 'base64', 'gb2312') att["Content-Type"] = 'application/octet-stream' #注意:此处basename要转换为gb2312编码,否则中文会有乱码。 # 特别,此处的basename为unicode编码,所以可以用basename.encode('gb2312') # 如果basename为utf-8编码,要用basename.decode('utf-8').encode('gb2312') att["Content-Disposition"] = 'attachment; filename=%s' % basename.encode('gb2312') msg.attach(att) try: #smtp = smtplib smtp = smtplib.SMTP() #连接服务器 smtp.connect('smtp.163.com', '25') #登录 smtp.login(username, usepassword) #发送邮件 smtp.sendmail(fromAddress, toAddress, msg.as_string()) #退出 smtp.quit() print('邮件发送成功email has send out !') except Exception as e: print str(e) if __name__ == "__main__": #获取脚本所在的绝对路径 AbsolutePath = sys.path[0] #切换目录进行编译 os.chdir(gPathSrc) #编译 Compile() #sys.exit(1)