这次再来给大家分享一波我工作中用到的几个脚本,主要分为:Python和Shell两个部分。 Python脚本部分实例:企业微信告警、FTP客户端、SSH客户端、Saltstack客户端、vCenter客户端、获取域名ssl证书过期时间、发送今天的天气预报以及未来的天气趋势图; Shell脚本部分实例:SVN完整备份、Zabbix监控用户密码过期、构建本地YUM以及上篇文章中有读者的需求(负载高时,查出占用比较高的进程脚本并存储或推送通知); 篇幅有些长,还请大家耐心翻到文末,毕竟有彩蛋。 Python脚本部分企业微信告警 此脚本通过企业微信应用,进行微信告警,可用于Zabbix监控。coding:utf8 importrequests importjson classDLF: definit(self,corpid,corpsecret): self。urlhttps:qyapi。weixin。qq。comcgibin self。corpidcorpid self。corpsecretcorpsecret self。tokenself。gettoken defgettoken(self): 获取企业微信API接口的accesstoken :return: tokenurlself。urlgettoken?corpidscorpsecrets(self。corpid,self。corpsecret) try: resrequests。get(tokenurl)。json tokenres〔accesstoken〕 returntoken exceptExceptionase: returnstr(e) defgetmediaid(self,fileobj): getmediaurlself。urlmediaupload?accesstoken{}typefile。format(self。token) data{media:fileobj} try: resrequests。post(urlgetmediaurl,filesdata) mediaidres。json〔mediaid〕 returnmediaid exceptExceptionase: returnstr(e) defsendtext(self,agentid,content,touserNone,topartyNone): sendmsgurlself。urlmessagesend?accesstokens(self。token) senddata{ touser:touser, toparty:toparty, msgtype:text, agentid:agentid, text:{ content:content } } try: resrequests。post(sendmsgurl,datajson。dumps(senddata)) exceptExceptionase: returnstr(e) defsendimage(self,agentid,fileobj,touserNone,topartyNone): mediaidself。getmediaid(fileobj) sendmsgurlself。urlmessagesend?accesstokens(self。token) senddata{ touser:touser, toparty:toparty, msgtype:image, agentid:agentid, image:{ mediaid:mediaid } } try: resrequests。post(sendmsgurl,datajson。dumps(senddata)) exceptExceptionase: returnstr(e) FTP客户端 通过ftplib模块操作ftp服务器,进行上传下载等操作。coding:utf8 fromftplibimportFTP fromosimportpath importcopy classFTPClient: definit(self,host,user,passwd,port21): self。hosthost self。useruser self。passwdpasswd self。portport self。res{status:True,msg:None} self。ftpNone self。login deflogin(self): 登录FTP服务器 :return:连接或登录出现异常时返回错误信息 try: self。ftpFTP self。ftp。connect(self。host,self。port,timeout30) self。ftp。login(self。user,self。passwd) exceptExceptionase: returne defupload(self,localpath,remotepathNone): 上传ftp文件 :paramlocalpath:localfilepath :paramremotepath:remotefilepath :return: ifnotlocalpath:returnPleaseselectalocalfile。 读取本地文件 fpopen(localpath,rb) 如果未传递远程文件路径,则上传到当前目录,文件名称同本地文件 ifnotremotepath: remotepathpath。basename(localpath) 上传文件 self。ftp。storbinary(STORremotepath,localpath) fp。close defdownload(self,remotepath,localpathNone): localpath :paramlocalpath:localfilepath :paramremotepath:remotefilepath :return: ifnotremotepath:returnPleaseselectaremotefile。 如果未传递本地文件路径,则下载到当前目录,文件名称同远程文件 ifnotlocalpath: localpathpath。basename(remotepath) 如果localpath是目录的话就和remotepath的basename拼接 ifpath。isdir(localpath): localpathpath。join(localpath,path。basename(remotepath)) 写入本地文件 fpopen(localpath,wb) 下载文件 self。ftp。retrbinary(RETRremotepath,fp。write) fp。close defnlst(self,dir): 查看目录下的内容 :return:以列表形式返回目录下的所有内容 fileslistself。ftp。nlst(dir) returnfileslist defrmd(self,dirNone): 删除目录 :paramdir:目录名称 :return:执行结果 ifnotdir:returnPleaseinputdirname rescopy。deepcopy(self。res) try: deldself。ftp。rmd(dir) res〔msg〕deld exceptExceptionase: res〔status〕False res〔msg〕str(e) returnres defmkd(self,dirNone): 创建目录 :paramdir:目录名称 :return:执行结果 ifnotdir:returnPleaseinputdirname rescopy。deepcopy(self。res) try: mkddself。ftp。mkd(dir) res〔msg〕mkdd exceptExceptionase: res〔status〕False res〔msg〕str(e) returnres defdelfile(self,filenameNone): 删除文件 :paramfilename:文件名称 :return:执行结果 ifnotfilename:returnPleaseinputfilename rescopy。deepcopy(self。res) try: delfself。ftp。delete(filename) res〔msg〕delf exceptExceptionase: res〔status〕False res〔msg〕str(e) returnres defgetfilesize(self,filenames〔〕): 获取文件大小,单位是字节 判断文件类型 :paramfilename:文件名称 :return:执行结果 ifnotfilenames:return{msg:Thisisanemptydirectory} resl forfileinfilenames: resd{} 如果是目录或者文件不存在就会报错 try: sizeself。ftp。size(file) typef except: 如果是路径的话size显示,file末尾加(dir) size typed filefile resd〔filename〕file resd〔size〕size resd〔type〕type resl。append(resd) returnresl defrename(self,oldnameNone,newnameNone): 重命名 :paramoldname:旧的文件或者目录名称 :paramnewname:新的文件或者目录名称 :return:执行结果 ifnotoldnameornotnewname:returnPleaseinputoldnameandnewname rescopy。deepcopy(self。res) try: renamefself。ftp。rename(oldname,newname) res〔msg〕renamef exceptExceptionase: res〔status〕False res〔msg〕str(e) returnres defclose(self): 退出ftp连接 :return: try: 向服务器发送quit命令 self。ftp。quit exceptException: returnNoresponsefromserver finally: 客户端单方面关闭连接 self。ftp。close SSH客户端 此脚本仅用于通过key连接,如需要密码连接,简单修改下即可。coding:utf8 importparamiko classSSHClient: definit(self,host,port,user,pkey): self。sshhosthost self。sshportport self。sshuseruser self。privatekeyparamiko。RSAKey。fromprivatekeyfile(pkey) self。sshNone self。connect defconnect(self): self。sshparamiko。SSHClient self。ssh。setmissinghostkeypolicy(paramiko。AutoAddPolicy) try: self。ssh。connect(hostnameself。sshhost,portself。sshport,usernameself。sshuser,pkeyself。privatekey,timeout10) except: returnsshconnectfail defexecutecommand(self,command): stdin,stdout,stderrself。ssh。execcommand(command) outstdout。read errstderr。read returnout,err defclose(self): self。ssh。close Saltstack客户端 通过api对Saltstack服务端进行操作,执行命令。!usrbinenvpython coding:utf8 importrequests importjson importcopy classSaltApi: 定义saltapi接口的类 初始化获得token definit(self): self。urlhttp:172。85。10。21:8000 self。usernamesaltapi self。passwordsaltapi self。headers{Contenttype:applicationjson} self。params{client:local,fun:None,tgt:None,arg:None} self。loginurlself。urllogin self。loginparams{username:self。username,password:self。password,eauth:pam} self。tokenself。getdata(self。loginurl,self。loginparams)〔token〕 self。headers〔XAuthToken〕self。token defgetdata(self,url,params): 请求url获取数据 :paramurl:请求的url地址 :paramparams:传递给url的参数 :return:请求的结果 senddatajson。dumps(params) requestrequests。post(url,datasenddata,headersself。headers) responserequest。json resultdict(response) returnresult〔return〕〔0〕 defgetauthkeys(self): 获取所有已经认证的key :return: datacopy。deepcopy(self。params) data〔client〕wheel data〔fun〕key。listall resultself。getdata(self。url,data) try: returnresult〔data〕〔return〕〔minions〕 exceptExceptionase: returnstr(e) defgetgrains(self,tgt,argid): 获取系统基础信息 :tgt:目标主机 :return: datacopy。deepcopy(self。params) iftgt: data〔tgt〕tgt else: data〔tgt〕 data〔fun〕grains。item data〔arg〕arg resultself。getdata(self。url,data) returnresult defexecutecommand(self,tgt,funcmd。run,argNone,tgttypelist,saltasyncFalse): 执行saltstack模块命令,类似于saltcmd。runcommand :paramtgt:目标主机 :paramfun:模块方法可为空 :paramarg:传递参数可为空 :return:执行结果 datacopy。deepcopy(self。params) ifnottgt:return{status:False,msg:targethostnotexist} ifnotarg: data。pop(arg) else: data〔arg〕arg iftgt!: data〔tgttype〕tgttype ifsaltasync:data〔client〕localasync data〔fun〕fun data〔tgt〕tgt resultself。getdata(self。url,data) returnresult defjobs(self,fundetail,jidNone): 任务 :paramfun:active,detail :paramjod:JobID :return:任务执行结果 data{client:runner} data〔fun〕fun iffundetail: ifnotjid:return{success:False,msg:jobidisnone} data〔fun〕jobs。lookupjid data〔jid〕jid else: return{success:False,msg:funisactiveordetail} resultself。getdata(self。url,data) returnresult vCenter客户端 通过官方SDK对vCenter进行日常操作,此脚本是我用于cmdb平台的,自动获取主机信息,存入数据库。frompyVim。connectimportSmartConnect,Disconnect,SmartConnectNoSSL frompyVmomiimportvim fromassetimportmodels importatexit classVmware: definit(self,ip,user,password,port,idc,vcenterid): self。ipip self。useruser self。passwordpassword self。portport self。idcididc self。vcenteridvcenterid defgetobj(self,content,vimtype,nameNone): 列表返回,name可以指定匹配的对象 containercontent。viewManager。CreateContainerView(content。rootFolder,vimtype,True) obj〔viewforviewincontainer。view〕 returnobj defgetesxiinfo(self): 宿主机信息 esxihost{} res{connectstatus:True,msg:None} try: connectthisthing siSmartConnectNoSSL(hostself。ip,userself。user,pwdself。password,portself。port,connectionPoolTimeout60) exceptExceptionase: res〔connectstatus〕False try: res〔msg〕(sCaughtvmodlfault:e。msg)(self。ip) exceptExceptionase: res〔msg〕s:connectionerror(self。ip) returnres disconnectthisthing atexit。register(Disconnect,si) contentsi。RetrieveContent esxiobjself。getobj(content,〔vim。HostSystem〕) foresxiinesxiobj: esxihost〔esxi。name〕{} esxihost〔esxi。name〕〔idcid〕self。idcid esxihost〔esxi。name〕〔vcenterid〕self。vcenterid esxihost〔esxi。name〕〔serverip〕esxi。name esxihost〔esxi。name〕〔manufacturer〕esxi。summary。hardware。vendor esxihost〔esxi。name〕〔servermodel〕esxi。summary。hardware。model foriinesxi。summary。hardware。otherIdentifyingInfo: ifisinstance(i,vim。host。SystemIdentificationInfo): esxihost〔esxi。name〕〔serversn〕i。identifierValue 系统名称 esxihost〔esxi。name〕〔systemname〕esxi。summary。config。product。fullName cpu总核数 esxicputotalesxi。summary。hardware。numCpuThreads 内存总量GB esximemorytotalesxi。summary。hardware。memorySize10241024strongtoutiaooriginspanclasshighlighttext1024strong 获取硬盘总量GB esxidisktotalstrongtoutiaooriginspanclasshighlighttext0strong fordsinesxi。datastore: esxidisktotalds。summary。capacity10241024strongtoutiaooriginspanclasshighlighttext1024strong 默认配置4核8G100G,根据这个配置计算剩余可分配虚拟机 defaultconfigure{ cpu:4, memory:8, disk:strongtoutiaooriginspanclasshighlighttext100strong } esxihost〔esxi。name〕〔vmhost〕 vmusagetotalcpustrongtoutiaooriginspanclasshighlighttext0strong vmusagetotalmemorystrongtoutiaooriginspanclasshighlighttext0strong vmusagetotaldiskstrongtoutiaooriginspanclasshighlighttext0strong 虚拟机信息 forvminesxi。vm: hostinfo{} hostinfo〔vmname〕vm。name hostinfo〔powerstatus〕vm。runtime。powerState hostinfo〔cputotalkernel〕str(vm。config。hardware。numCPU)核 hostinfo〔memorytotal〕str(vm。config。hardware。memoryMB)MB hostinfo〔systeminfo〕vm。config。guestFullName diskinfo disktotalstrongtoutiaooriginspanclasshighlighttext0strong fordinvm。config。hardware。device: ifisinstance(d,vim。vm。device。VirtualDisk): disktotald。capacityInKB1024strongtoutiaooriginspanclasshighlighttext1024strong diskinfod。deviceInfo。label:str((d。capacityInKB)10241024)GB, hostinfo〔diskinfo〕diskinfo esxihost〔esxi。name〕〔vmhost〕。append(hostinfo) 计算当前宿主机可用容量:总量已分配的 ifhostinfo〔powerstatus〕poweredOn: vmusagetotalcpuvm。config。hardware。numCPU vmusagetotaldiskdisktotal vmusagetotalmemory(vm。config。hardware。memoryMB1024) esxicpufreeesxicputotalvmusagetotalcpu esximemoryfreeesximemorytotalvmusagetotalmemory esxidiskfreeesxidisktotalvmusagetotaldisk esxihost〔esxi。name〕〔cpuinfo〕Total:d核,Free:d核(esxicputotal,esxicpufree) esxihost〔esxi。name〕〔memoryinfo〕Total:dGB,Free:dGB(esximemorytotal,esximemoryfree) esxihost〔esxi。name〕〔diskinfo〕Total:dGB,Free:dGB(esxidisktotal,esxidiskfree) 计算cpu内存磁盘按照默认资源分配的最小值,即为当前可分配资源 ifesxicpufree4oresximemoryfree8oresxidiskfree100: freeallocationvmhoststrongtoutiaooriginspanclasshighlighttext0strong else: freeallocationvmhostint(min( 〔 esxicpufreedefaultconfigure〔cpu〕, esximemoryfreedefaultconfigure〔memory〕, esxidiskfreedefaultconfigure〔disk〕 〕 )) esxihost〔esxi。name〕〔freeallocationvmhost〕freeallocationvmhost esxihost〔connectstatus〕True returnesxihost defwritetodb(self): esxihostself。getesxiinfo 连接失败 ifnotesxihost〔connectstatus〕: returnesxihost delesxihost〔connectstatus〕 formachineipinesxihost: 物理机信息 esxihostdictesxihost〔machineip〕 虚拟机信息 virtualhostesxihost〔machineip〕〔vmhost〕 delesxihost〔machineip〕〔vmhost〕 objmodels。EsxiHost。objects。create(esxihostdict) obj。save forhostinfoinvirtualhost: hostinfo〔managementhostid〕obj。id obj2models。virtualHost。objects。create(hostinfo) obj2。save 获取域名ssl证书过期时间 用于zabbix告警importre importsys importtime importsubprocess fromdatetimeimportdatetime fromioimportStringIO defmain(domain): fStringIO commfcurlIvshttps:{domain}connecttimeout10 resultsubprocess。getstatusoutput(comm) f。write(result〔1〕) try: mre。search(startdate:(。?)。?expiredate:(。?)。?commonname:(。?)。?issuer:CN(。?),f。getvalue,re。S) startdatem。group(1) expiredatem。group(2) commonnamem。group(3) issuerm。group(4) exceptExceptionase: return999999999 time字符串转时间数组 startdatetime。strptime(startdate,bdH:M:SYGMT) startdatesttime。strftime(YmdH:M:S,startdate) datetime字符串转时间数组 expiredatedatetime。strptime(expiredate,bdH:M:SYGMT) expiredatestdatetime。strftime(expiredate,YmdH:M:S) 剩余天数 remaining(expiredatedatetime。now)。days returnremaining ifnamemain: domainsys。argv〔1〕 remainingdaysmain(domain) print(remainingdays) 发送今天的天气预报以及未来的天气趋势图 此脚本用于给老婆大人发送今天的天气预报以及未来的天气趋势图,现在微信把网页端禁止了,没法发送到微信了,我是通过企业微信进行通知的,需要把你老婆大人拉到企业微信,无兴趣的小伙伴跳过即可。coding:utf8 importrequests importjson importdatetime defweather(city): urlhttp:wthrcdn。etouch。cnweathermini?cityscity try: datarequests。get(url)。json〔data〕 citydata〔city〕 ganmaodata〔ganmao〕 todayweatherdata〔forecast〕〔0〕 res老婆今天是{}今天天气概况城市:{:10}时间:{:10}高温:{:10}低温:{:10}风力:{:10}风向:{:10}天气:{:10}稍后会发送近期温度趋势图,请注意查看。 。format( ganmao, city, datetime。datetime。now。strftime(Ymd), todayweather〔high〕。split〔1〕, todayweather〔low〕。split〔1〕, todayweather〔fengli〕。split(〔)〔2〕。split(〕)〔0〕, todayweather〔fengxiang〕,todayweather〔type〕, ) return{sourcedata:data,res:res} exceptExceptionase: returnstr(e) 获取天气预报趋势图 python coding:utf8 importmatplotlib。pyplotasplt importre importdatetime defFutureweatherstates(forecast,savepath,daynum5): 展示未来的天气预报趋势图 :paramforecast:天气预报预测的数据 :paramdaynum:未来几天 :return:趋势图 futureforecastforecast dict{} foriinrange(daynum): data datefutureforecast〔i〕〔date〕 dateint(re。findall(d,date)〔0〕) data。append(int(re。findall(d,futureforecast〔i〕〔high〕)〔0〕)) data。append(int(re。findall(d,futureforecast〔i〕〔low〕)〔0〕)) data。append(futureforecast〔i〕〔type〕) dict〔date〕data datalistsorted(dict。items) date hightemperature lowtemperature foreachindatalist: date。append(each〔0〕) hightemperature。append(each〔1〕〔0〕) lowtemperature。append(each〔1〕〔1〕) figplt。plot(date,hightemperature,r,date,lowtemperature,b) currentdatedatetime。datetime。now。strftime(Ym) plt。rcParams〔font。sansserif〕〔SimHei〕 plt。rcParams〔axes。unicodeminus〕False plt。xlabel(currentdate) plt。ylabel() plt。legend(〔高温,低温〕) plt。xticks(date) plt。title(最近几天温度变化趋势) plt。savefig(savepath) 发送到企业微信 python coding:utf8 importrequests importjson classDLF: definit(self,corpid,corpsecret): self。urlhttps:qyapi。weixin。qq。comcgibin self。corpidcorpid self。corpsecretcorpsecret self。tokenself。gettoken defgettoken(self): 获取企业微信API接口的accesstoken :return: tokenurlself。urlgettoken?corpidscorpsecrets(self。corpid,self。corpsecret) try: resrequests。get(tokenurl)。json tokenres〔accesstoken〕 returntoken exceptExceptionase: returnstr(e) defgetmediaid(self,fileobj): getmediaurlself。urlmediaupload?accesstoken{}typefile。format(self。token) data{media:fileobj} try: resrequests。post(urlgetmediaurl,filesdata) mediaidres。json〔mediaid〕 returnmediaid exceptExceptionase: returnstr(e) defsendtext(self,agentid,content,touserNone,topartyNone): sendmsgurlself。urlmessagesend?accesstokens(self。token) senddata{ touser:touser, toparty:toparty, msgtype:text, agentid:agentid, text:{ content:content } } try: resrequests。post(sendmsgurl,datajson。dumps(senddata)) exceptExceptionase: returnstr(e) defsendimage(self,agentid,fileobj,touserNone,topartyNone): mediaidself。getmediaid(fileobj) sendmsgurlself。urlmessagesend?accesstokens(self。token) senddata{ touser:touser, toparty:toparty, msgtype:image, agentid:agentid, image:{ mediaid:mediaid } } try: resrequests。post(sendmsgurl,datajson。dumps(senddata)) exceptExceptionase: returnstr(e) main脚本 coding:utf8 fromplugins。weatherforecastimportweather fromplugins。trendchartimportFutureweatherstates fromplugins。sendwechatimportDLF importos 企业微信相关信息 corpidxxx corpsecretxxx agentidxxx 天气预报趋势图保存路径 pathos。path。dirname(os。path。abspath(file)) savepathos。path。join(path,。tmpweatherforecast。jpg) 获取天气预报信息 contentweather(大兴) 发送文字消息 dlfDLF(corpid,corpsecret) dlf。sendtext(agentidagentid,contentcontent〔res〕,toparty1) 生成天气预报趋势图 Futureweatherstates(content〔sourcedata〕〔forecast〕,savepath) 发送图片消息 fileobjopen(savepath,rb) dlf。sendimage(agentidagentid,toparty1,fileobjfileobj) Shell脚本部分SVN完整备份 通过hotcopy进行SVN完整备份,备份保留7天。!binbash Filename:svnbackuprepos。sh Date:20201214 Author:JakeTian Email:JakeTian。com Crontab:5923binbashBASEPATHsvnbackuprepos。shdev21 Notes:将脚本加入crontab中,每天定时执行 Description:SVN完全备份 sete SRCPATHoptsvndata DSTPATHdatasvnbackup LOGFILEDSTPATHlogssvnbackup。log SVNBACKUPCbinsvnadminhotcopy SVNLOOKCbinsvnlookyoungest TODAY(dateF) cdSRCPATH ALLREPOS(find。maxdepth1typed!namehttpda!namebaktrd。) 创建备份目录,备份脚本ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a目录 testdDSTPATHmkdirpDSTPATH testdDSTPATHlogsmkdirDSTPATHlogs testdDSTPATHTODAYmkdirDSTPATHTODAY 备份repos文件 forrepoinALLREPOS do SVNBACKUPCSRCPATHrepoDSTPATHTODAYrepo 判断备份是否完成 ifSVNLOOKCDSTPATHTODAYthen echoTODAY:repoBackupSuccessLOGFILE else echoTODAY:repoBackupFailLOGFILE fi done 备份用户密码文件和权限文件 cppauthzaccess。confDSTPATHTODAY ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件转储 mvLOGFILELOGFILETODAY 删除七天前的备份 sevendaysago(dated7daysagoF) rmrfDSTPATHsevendaysago zabbix监控用户密码过期 用于Zabbix监控Linux系统用户(shell为binbash和binsh)密码过期,密码有效期剩余7天触发加自动发现用户。!binbash diskarray(awkF:NFbinbashbinsh{print1}etcpasswd) length{diskarray〔〕} printf{ printfdata:〔 for((i0;i)) do printf{ printf{USERNAME}:{diskarray〔i〕}} if〔ilt〔length1〕〕;then printf, fi done printf〕 printf} 检查用户密码过期 !binbash exportLANGenUS。UTF8 SEVENDAYSAGO(dated7days) user1 将Sep09,2018格式的时间转换成unix时间 expiresdate(sudochageluserawkF:Passwordexpires{printNF}sednsp) if〔〔expiresdate!never〕〕;then expiresdate(datedexpiresdates) if〔expiresdateleSEVENDAYSAGO〕;then echo1 else echo0 fi else echo0 fi 构建本地YUM 通过rsync的方式同步yum,通过nginx只做httpyum站点; 但是centos6的镜像最近都不能用了,国内貌似都禁用了,如果找到合适的自行更换地址。!binbash 更新yum镜像 RsyncCommandrsyncrvutHPdeletedeleteafterdelayupdatesbwlimit1000 DIRappyumData LogDirDIRlogs Centos6BaseDIRCentos6x8664Base Centos7BaseDIRCentos7x8664Base Centos6EpelDIRCentos6x8664Epel Centos7EpelDIRCentos7x8664Epel Centos6SaltDIRCentos6x8664Salt Centos7SaltDIRCentos7x8664Salt Centos6UpdateDIRCentos6x8664Update Centos7UpdateDIRCentos7x8664Update Centos6DockerDIRCentos6x8664Docker Centos7DockerDIRCentos7x8664Docker Centos6Mysql57DIRCentos6x8664MysqlMysql5。7 Centos7Mysql57DIRCentos7x8664MysqlMysql5。7 Centos6Mysql80DIRCentos6x8664MysqlMysql8。0 Centos7Mysql80DIRCentos7x8664MysqlMysql8。0 MirrorDomainrsync:rsync。mirrors。ustc。edu。cn 目录不存在就创建 checkdir{ fordirin do testddirmkdirpdir done } 检查rsync同步结果 checkrsyncstatus{ if〔?eq0〕;then echorsyncsuccess1 else echorsyncfail1 fi } checkdirDIRLogDirCentos6BaseCentos7BaseCentos6EpelCentos7EpelCentos6SaltCentos7SaltCentos6UpdateCentos7UpdateCentos6DockerCentos7DockerCentos6Mysql57Centos7Mysql57Centos6Mysql80Centos7Mysql80 Baseyumrepo RsyncCommandMirrorDomainrepocentos6osx8664Centos6BaseLogDircentos6Base。log21 checkrsyncstatusLogDircentos6Base。log RsyncCommandMirrorDomainrepocentos7osx8664Centos7BaseLogDircentos7Base。log21 checkrsyncstatusLogDircentos7Base。log Epelyumrepo RsyncCommandMirrorDomainrepoepel6x8664Centos6EpelLogDircentos6Epel。log21 checkrsyncstatusLogDircentos6Epel。log RsyncCommandMirrorDomainrepoepel7x8664Centos7EpelLogDircentos7Epel。log21 checkrsyncstatusLogDircentos7Epel。log SaltStackyumrepo RsyncCommandMirrorDomainreposaltyumredhat6x8664Centos6SaltLogDircentos6Salt。log21 lnsCentos6Saltarchive(lsCentos6Saltarchivetail1)Centos6Saltlatest checkrsyncstatusLogDircentos6Salt。log RsyncCommanMirrorDomainreposaltyumredhat7x8664Centos7SaltLogDircentos7Salt。log21 checkrsyncstatusLogDircentos7Salt。log lnsCentos7Saltarchive(lsCentos7Saltarchivetail1)Centos7Saltlatest Dockeryumrepo RsyncCommandMirrorDomainrepodockercelinuxcentos7x8664stableCentos7DockerLogDircentos7Docker。log21 checkrsyncstatusLogDircentos7Docker。log centosupdateyumrepo RsyncCommandMirrorDomainrepocentos6updatesx8664Centos6UpdateLogDircentos6Update。log21 checkrsyncstatusLogDircentos6Update。log RsyncCommandMirrorDomainrepocentos7updatesx8664Centos7UpdateLogDircentos7Update。log21 checkrsyncstatusLogDircentos7Update。log mysql5。7yumrepo RsyncCommandMirrorDomainrepomysqlrepoyummysql5。7communityel6x8664Centos6Mysql57LogDircentos6Mysql5。7。log21 checkrsyncstatusLogDircentos6Mysql5。7。log RsyncCommandMirrorDomainrepomysqlrepoyummysql5。7communityel7x8664Centos7Mysql57LogDircentos7Mysql5。7。log21 checkrsyncstatusLogDircentos7Mysql5。7。log mysql8。0yumrepo RsyncCommandMirrorDomainrepomysqlrepoyummysql8。0communityel6x8664Centos6Mysql80LogDircentos6Mysql8。0。log21 checkrsyncstatusLogDircentos6Mysql8。0。log RsyncCommandMirrorDomainrepomysqlrepoyummysql8。0communityel7x8664Centos7Mysql80LogDircentos7Mysql8。0。log21 checkrsyncstatusLogDircentos7Mysql8。0。log 读者需求解答 负载高时,查出占用比较高的进程脚本并存储或推送通知 这部分内容是上篇Shell脚本实例中底部读者留言的需求,如下:!binbash 物理cpu个数 physicalcpucount(egrepphysicalidproccpuinfosortuniqwcl) 单个物理cpu核数 physicalcpucores(egrepcpucoresproccpuinfouniqawk{printNF}) 总核数 totalcpucores((physicalcpucountphysicalcpucores)) 分别是一分钟、五分钟、十五分钟负载的阈值,其中有一项超过阈值才会触发 oneminloadthresholdtotalcpucores fiveminloadthreshold(awkBEGIN{printtotalcpucores0。8}) fifteenminloadthreshold(awkBEGIN{printtotalcpucores0。7}) 分别是分钟、五分钟、十五分钟负载平均值 oneminload(uptimeawk{print(NF2)}trd,) fiveminload(uptimeawk{print(NF1)}trd,) fifteenminload(uptimeawk{printNF}trd,) 获取当前cpu内存磁盘io信息,并写入ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件 如果需要发送消息或者调用其他,请自行编写函数即可 getinfo{ logdircpuhighscriptlog testdlogdirmkdirlogdir pseouser,pid,cpu,stat,time,commandsortcpuhead10logdircputop10。log pseouser,pid,mem,rss,vsz,stat,time,commandsortmemhead10logdirmemtop10。log iostatdx110logdirdiskio10。log } exportfgetinfo echooneminloadoneminloadthresholdfiveminloadfiveminloadthresholdfifteenminloadfifteenminloadthreshold awk{if(123456)system(getinfo)} 以上,就是今天分享的全部内容了。 希望大家通过这些案例能够学以致用,结合自身的实际场景进行运用,从而提高自己的工作效率。