Linux实用运维脚本分享查看僵尸进程psalgawk{print2,4}grepZ匹配电子邮件的地址catindex。htmlegrepo〔AZaz09。〕〔AZaz09。〕。〔azAZ〕{2,4}ans。txt匹配httpURLcatindex。htmlegrepohttp:〔AZaz09。〕。〔azAZ〕{2,3}ans。txt纯文本形式下载网页lynxdumpwww。rumenz。complain。txt只打印HTTP头部信息,无须远程下载文件curlheadwww。rumenz。com使用POST提交数据curldparam2nickwolfem212345http:www。rumenz。comlogin。cgi显示分组途经的网关traceroutewww。rumenz。com列出系统中的开放端口以及运行在端口上的服务lsofinc命令建立socket连接设置监听ncl5555连接到套接字nc192。0。0。15555快速文件传输接收端ncl5555destinationfilename发送端nc192。0。0。15555sourcefilename找出指定目录最大的n个文件duaktargetdirsortnrk1headn4du中a为递归,k为sort中n为数字,r为降序,k指定列向终端中的所有登陆用户发送广播信息catmessage。txtwall创建新的screen窗口screen打印所有的。txt和。pdf文件find。(name。txtoname。pdf)printexeccommand{};是连用的,所有符合的都会放置在{}中,去执行command将文件分割成多个大小为10kb的文件splitb10kdata。file打印两个文件的交集commA。txtB。txt3sedssed移除空白行seddfilemysql备份!binbashseteUSERbackupPASSWORDbackup数据库数据目录DATADIRdatamysqlBININDEXDATADIRmysqlbin。index备份目录BACKUPDIRdatabackupmysqlBACKUPLOGvarlogmysqlbackup。logDATEdateYmdTIMEdateYmdHLOGTIMEdateYmdH:M:SDELETEBINLOGTIME7dayINCREMENTINTERVAL3hournote(){printf〔LOGTIME〕note:BACKUPLOG;}warning(){printf〔LOGTIME〕warning:BACKUPLOG;}error(){printf〔LOGTIME〕error:BACKUPLOG;exit1;}fullbackup(){localdbslslDATADIRgrepdawkF{print9}fordbindbsdolocalbackupdirBACKUPDIRfulldblocalfilenamedb。DATElocalbackupfilebackupdirfilename。sqlif〔!dbackupdir〕thenmkdirpbackupdir{error创建数据库db全量备份目录backupdir失败;}note数据库db全量备份目录backupdir不存在,创建完成;finotefullbackupdbstart。。。mysqldumpuser{USER}password{PASSWORD}flushlogsskiplocktablesquickdbbackupfile{warning数据库db备份失败;}cdbackupdirtarcPzffilename。tar。gzfilename。sqlrmfbackupfilechownfRmysql:mysqlbackupdirnote数据库db备份成功;notefullbackupdbend。done}incrementbackup(){localStartTimedatedINCREMENTINTERVALagoYmdH:M:SlocalDELETEBINLOGENDTIMEdatedDELETEBINLOGTIMEagoYmdH:M:SlocaldbslslDATADIRgrepdawkF{print9}mysqluUSERpPASSWORDepurgemasterlogsbeforeDELETEBINLOGENDTIMEnotedeleteDELETEBINLOGTIMEfilenamecatBININDEXawkF{print2}foriinfilenamedofordbindbsdolocalbackupdirBACKUPDIRincrementdblocalfilenamedb。TIMElocalbackupfilebackupdirfilename。sqlif〔!dbackupdir〕thenmkdirpbackupdir{error创建数据库db增量备份目录backupdir失败;}note数据库db增量备份目录backupdir不存在,创建完成;finoteincrementbackupdbformtimeStartTimestart。。。mysqlbinlogddbstartdatetimeStartTimeDATADIRibackupfile{warning数据库db备份失败;}noteincrementbackupdbend。donedonefordbindbsdolocalbackupdirBACKUPDIRincrementdblocalfilenamedb。TIMElocalbackupfilebackupdirfilename。sqlcdbackupdirtarcPzffilename。tar。gzfilename。sqlrmfbackupfilenote数据库db备份成功;done}case1infull);increment);)exit2;;esacexit1目录备份!binbash时间DATE(dateYmdHMS)备份目录BACKUPDIRhomebackups需要备份的目录SORFILEopt目标文件名DESFILEhomebackupsSORFILE。(dateYmdHMS)。zip〔!dBACKUPDIR〕mkdirpBACKUPDIRcdBACKUPDIRechostartbackupSORFILE。。。sleep3echoDESFILEtarcvfDESFILESORFILEgzipf。zipDESFILEziprDESFILESORFILEdevnullif〔?0〕thenecho(dateYmd)zipsucessbackup。logelseecho(dateYmd)zipfailedbackup。logexit0fi删除3天前的备份findBACKUPDIRtypefctime3xargsrmrfPING查询!binbash用途:根据网络配置对网络地址192。168。0进行修改,检查是否是活动状态{start。。end}shell扩展生成一组地址foripin192。168。0。{1。。255}do(pingipc2devnull标准输出重定向,和1一致21将标准错误输出重定向到标准输出file将标准输出和标准错误输出都重定向到文件filename中if〔?eq0〕;thenechoipisalivefi)donewait并行ping,加速磁盘IO检查iostat是查看磁盘活动统计情况显示所有设备负载情况rs:每秒完成的读IO设备次数。即ws:每秒完成的写IO设备次数。即wios等iostat每隔2秒刷新磁盘IO信息,并且每次显示3次iostat23显示某个磁盘的IO信息iostatdsda1显示tty和cpu信息iostatt以M为单位显示磁盘IO信息iostatm查看TPS和吞吐量信息kBreads:每秒从设备(driveexpressed)读取的数据量;kBwrtns:每秒向设备(driveexpressed)写入的数据量;kBread:读取的总数据量;kBwrtn:写入的总数量数据量;iostatdk11查看设备使用率(util)、响应时间(await)iostatdxk11查看CPU状态iostatc13统计进程(pid)的stat,进程的stat自然包括进程的IO状况pidstat只显示IOpidstatd1dIO信息,r缺页及内存信息uCPU使用率t以线程为统计单位11秒统计一次pidstaturdt1文件级IO分析,查看当前文件由哪些进程打开lsoflsprocpidfd利用sar报告磁盘IO信息DEV正在监视的块设备tps每秒钟物理设备的IO传输总量rdsecs每秒从设备读取的扇区数量wrsecs每秒向设备写入的扇区数量avgrqszIO请求的平均扇区数avgquszIO请求的平均队列长度awaitIO请求的平均等待时间,单位为毫秒svctmIO请求的平均服务时间,单位为毫秒utilIO请求所占用的时间的百分比,即设备利用率sarpd103iotoptop的io版iotop查看页面缓存信息其中的Cached指用于pagecache的内存大小(diskcacheSwapCache)。随着写入缓存页,Dirty的值会增加一旦开始把缓存页写入硬盘,Writeback的值会增加直到写入结束。catprocmeminfo查看有多少个pdflush进程Linux用pdflush进程把数据从缓存页写入硬盘pdflush的行为受procsysvm中的参数的控制procsysvmdirtywritebackcentisecs(default500):1100秒,多长时间唤醒pdflush将缓存页数据写入硬盘。默认5秒唤醒2个(更多个)线程。如果wrteback的时间长于dirtywritebackcentisecs的时间,可能会出问题catprocsysvmnrpdflushthreads查看IO调度器调度算法noopanticipatorydeadline〔cfq〕deadline:deadline算法保证对既定的IO请求以最小的延迟时间。anticipatory:有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么。这对于随机读取会造成较大的延时。对数据库应用很糟糕,而对于WebServer等则会表现不错。cfq:对每个进程维护一个IO队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每一个IO请求都是公平。适合离散读的应用。noop:对所有IO请求都用FIFO队列形式处理。默认IO不会存在性能问题。catsysblock〔disk〕queuescheduler改变IO调度器echodeadlinesysblocksdXqueuescheduler提高调度器请求队列的echo4096sysblocksdXqueuenrrequests性能相关查看当前系统loaduptime查看系统状态和每个进程的系统资源使用状况top可视化显示CPU的使用状况htop查看每个CPU的负载信息mpstatPALL1每隔1秒查看磁盘IO的统计信息iostatxkdz1每隔一秒查看虚拟内存的使用信息vmstat1查看内存使用统计信息free查看网络使用信息nicstatz1类似vmstat的显示优化的工具dstat1查看系统活动状态,比如系统分页统计,块设备IO统计等sar网络连接状态查看netstats进程资源使用信息查看pidstat1pidstatd1查看某个进程的系统调用信息p后面是进程id,tttT进程系统后的系统调用时间stracetttTp12670统计IO设备输入输出的系统调用信息stracecddifdevzeroofdevnullbs512count1024ktcpdump查看网络数据包tcpdumpnrtmpout。tcpdump块设备的读写事件信息统计btracedevsdbiotop查看某个进程的IO操作统计信息iotopbod5slabtop查看内核slab内存分配器的使用信息slabtopsc系统参数设置sysctla系统性能指标统计信息perfstatgzipfile1系统cpu活动状态查看perfrecordagF997sleep10进程相关processes进程管理ps查看当前系统执行的线程列表,进行瞬间状态,不是连续状态,连续状态需要使用top名称查看更多常用参数请使用manps查看ps显示所有进程详细信息psauxu显示某个用户的进程列表psfuwwwdataC通过名字或者命令搜索进程psCapache2sort根据进程cpu使用率降序排列,查看前5个进程pcpu表示降序pcpu升序psauxsortpcpuhead5f用树结构显示进程的层次关系,父子进程情况下psfforestCapache2显示一个父进程的所有子进程psopid,uname,commCapache2psppid2359显示一个进程的所有线程L参数psp3150L显示进程的执行时间o参数pseopid,comm,etimewatch命令可以用来实时捕捉ps显示进程watchn1pseopid,uname,cmd,pmem,pcpusortpmem,pcpuhead15jobs查看后台运行的进程jobs命令执行的结果,表示是一个当前的作业,减号表是是一个当前作业之后的一个作业,jobsl选项可显示所有任务的PID,jobs的状态可以是running,stopped,Terminated,但是如果任务被终止了(kill),shell从当前的shell环境已知的列表中删除任务的进程标识;也就是说,jobs命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息jobs查看后台运营的进程号jobsp查看现在被终止或者退出的进程号jobsnkill命令终止一个前台进程可以使用CtrlC键kill通过top或者ps获取进程id号kill〔s信号p〕〔a〕进程号。。。发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。关闭进程号12的进程kill12等同于在前台运行PID为123的进程时按下CtrlC键kill2123如果任无法终止该程序可用KILL参数,其发送的信号为SIGKILL(9),将强制结束进程kill9123列出所有信号名称HUP1终端断线INT2中断(同CtrlC)QUIT3退出(同Ctrl)TERM15终止KILL9强制终止CONT18继续(与STOP相反,fgbg命令)STOP19暂停(同CtrlZ)killl得到指定信号的数值killlKILL杀死指定用户所有进程killupeidalinuxkill9(psefgreppeidalinux)将后台中的命令调至前台继续运行将进程123调至前台执行fg123将一个在后台暂停的命令,变成继续执行bg123该命令可以在你退出帐户关闭终端之后继续运行相应的进程。nohup就是不挂起的意思下面输出被重定向到myout。file文件中nohupcommandmyout。file21at:计划任务,在特定的时间执行某项工作,在特定的时间执行一次。格式:atHH:MMYYYYMMDDHH(小时):MM(分钟)YYYY(年)MM(月份)DD(日)HH〔ampm〕D(天)daysHH(小时)〔am(上午)pm(下午)〕days(天)at12:00(时间)at命令设定12:00执行一项操作atuseraddaaa在at命令里设定添加用户aaactrld退出at命令tailfetcpasswd查看etcpasswd文件后十行是否增加了一个用户aaa计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务。atq启动计划任务后,如果不想启动设定好的计划任务可以使用atrm命令删除。atrm1删除计划任务1pstree命令:列出当前的进程,以及它们的树状结构格式:pstree〔选项〕〔piduser〕pstreenice命令:改变程序执行的优先权等级应用程序优先权值的范围从2019,数字越小,优先权就越高。一般情况下,普通应用程序的优先权值(CPU使用权值)都是0,如果让常用程序拥有较高的优先权等级,自然启动和运行速度都会快些。需要注意的是普通用户只能在019之间调整应用程序的优先权值,只有超级用户有权调整更高的优先权值(从2019)。nice〔n优先等级〕〔help〕〔version〕〔命令〕nicen5lssleep命令:使进程暂停执行一段时间sleep1m;daterenice命令renice命令允许用户修改一个正在运行进程的优先权。利用renice命令可以在命令执行时调整其优先权。其中,参数number与nice命令的number意义相同。(1)用户只能对自己所有的进程使用renice命令。(2)root用户可以在任何进程上使用renice命令。(3)只有root用户才能提高进程的优先权renice5p5200PID为5200的进程nice设为5pmap命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息pmapPIDpmap20367javadump。sh!binshDUMPPIDSpsnoheadingCjavafwidth1000awk{print2}if〔zDUMPPIDS〕;thenechoTheserverHOSTNAMEisnotstarted!exit1;fiDUMPROOTdumpif〔!dDUMPROOT〕;thenmkdirDUMPROOTfiDUMPDATEdateYmdHMSDUMPDIRDUMPROOTdumpDUMPDATEif〔!dDUMPDIR〕;thenmkdirDUMPDIRfiforPIDinDUMPPIDS;doFullthreaddump用来查线程占用,死锁等问题JAVAHOMEbinjstackPIDDUMPDIRjstackPID。dump21echoe。c打印出一个给定的Java进程、Javacore文件或远程Debug服务器的Java配置信息,具体包括Java系统属性和JVM命令行参数。JAVAHOMEbinjinfoPIDDUMPDIRjinfoPID。dump21echoe。cjstat能够动态打印jvm(JavaVirtualMachineStatisticsMonitoringTool)的相关统计信息。如younggc执行的次数、fullgc执行的次数,各个内存分区的空间大小和可使用量等信息。JAVAHOMEbinjstatgcutilPIDDUMPDIRjstatgcutilPID。dump21echoe。cJAVAHOMEbinjstatgccapacityPIDDUMPDIRjstatgccapacityPID。dump21echoe。c未指定选项时,jmap打印共享对象的映射。对每个目标VM加载的共享对象,其起始地址、映射大小及共享对象文件的完整路径将被打印出来,JAVAHOMEbinjmapPIDDUMPDIRjmapPID。dump21echoe。cheap打印堆情况的概要信息,包括堆配置,各堆空间的容量、已使用和空闲情况JAVAHOMEbinjmapheapPIDDUMPDIRjmapheapPID。dump21echoe。cdump将jvm的堆中内存信息输出到一个文件中,然后可以通过eclipsememoryanalyzer进行分析注意:这个jmap使用的时候jvm是处在假死状态的,只能在服务瘫痪的时候为了解决问题来使用,否则会造成服务中断。JAVAHOMEbinjmapdump:formatb,fileDUMPDIRjmapdumpPID。dumpPID21echoe。c显示被进程打开的文件信息if〔rusrsbinlsof〕;thenusrsbinlsofpPIDDUMPDIRlsofPID。dumpechoe。cfidone主要负责收集、汇报与存储系统运行信息的。if〔rusrbinsar〕;thenusrbinsarDUMPDIRsar。dumpechoe。cfi主要负责收集、汇报与存储系统运行信息的。if〔rusrbinuptime〕;thenusrbinuptimeDUMPDIRuptime。dumpechoe。cfi内存查看if〔rusrbinfree〕;thenusrbinfreetDUMPDIRfree。dumpechoe。cfi可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。if〔rusrbinvmstat〕;thenusrbinvmstatDUMPDIRvmstat。dumpechoe。cfi报告与CPU相关的一些统计信息if〔rusrbinmpstat〕;thenusrbinmpstatDUMPDIRmpstat。dumpechoe。cfi报告与IO相关的一些统计信息if〔rusrbiniostat〕;thenusrbiniostatDUMPDIRiostat。dumpechoe。cfi报告与网络相关的一些统计信息if〔rbinnetstat〕;thenbinnetstatDUMPDIRnetstat。dumpechoe。cfiechoOK!常用工具安装!usrbinenvbash控制台颜色BLACK33〔1;30mRED33〔1;31mGREEN33〔1;32mYELLOW33〔1;33mBLUE33〔1;34mPURPLE33〔1;35mCYAN33〔1;36mRESET(tputsgr0)printf{BLUE}catEOF安装常用命令工具命令工具清单如下:核心工具:df、du、chkconfig网络工具:ifconfig、netstat、route、iptablesIP工具:ip、ss、ping、tracepath、tracerouteDNS工具:dig、host、nslookup、whois端口工具:lsof、nc、telnet下载工具:curl、wget编辑工具:emacs、vim流量工具:iftop、nethogs抓包工具:tcpdump压缩工具:unzip、zip版本控制工具:git、subversionEOFprintf{RESET}printf{GREEN}安装常用命令工具开始{RESET}核心工具printf{CYAN}installcoreutils(df、du){RESET}yuminstallycoreutilsprintf{CYAN}installchkconfig{RESET}yuminstallychkconfig网络工具printf{CYAN}installnettools(ifconfig、netstat、route){RESET}yuminstallynettoolsprintf{CYAN}installiptables{RESET}yuminstallyiptablesIP工具printf{CYAN}installiputils(ping、tracepath){RESET}yuminstallyiputilsprintf{CYAN}installtraceroute{RESET}yuminstallytracerouteprintf{CYAN}installiproute(ip、ss){RESET}yuminstallyiproute端口工具printf{CYAN}installlsof{RESET}yuminstallylsofprintf{CYAN}installnc{RESET}yuminstallyncprintf{CYAN}installnetstat{RESET}yuminstallynetstatDNS工具printf{CYAN}installbindutils(dig、host、nslookup){RESET}yuminstallybindutilsprintf{CYAN}installwhois{RESET}yuminstallywhois下载工具printf{CYAN}installcurl{RESET}yuminstallycurlprintf{CYAN}installwget{RESET}yuminstallywget编辑工具printf{CYAN}installemacs{RESET}yuminstallyemacsprintf{CYAN}installvim{RESET}yuminstallyvim流量工具printf{CYAN}installiftop{RESET}yuminstallyiftopprintf{CYAN}installnethogs{RESET}yuminstallynethogs抓包工具printf{CYAN}installtcpdump{RESET}yuminstallytcpdump压缩工具printf{CYAN}installunzip{RESET}yuminstallyunzip版本控制工具printf{CYAN}installgit{RESET}yuminstallygitprintf{CYAN}installsubversion{RESET}yuminstallysubversionprintf{GREEN}安装常用命令工具结束{RESET}常用lib库安装!usrbinenvbash控制台颜色BLACK33〔1;30mRED33〔1;31mGREEN33〔1;32mYELLOW33〔1;33mBLUE33〔1;34mPURPLE33〔1;35mCYAN33〔1;36mRESET(tputsgr0)printf{BLUE}catEOF安装常见lib如果不知道命令在哪个lib,可以使用yumsearchxxx来查找lib清单如下:gccgccckerneldevellibtoolopensslopenssldevelzlibzlibdevelpcreEOFprintf{RESET}printf{GREEN}安装常见lib开始{RESET}printf{CYAN}installgccgccckerneldevellibtool{RESET}yumyinstallmakegccgccckerneldevellibtoolprintf{CYAN}installopensslopenssldevel{RESET}yumyinstallmakeopensslopenssldevelprintf{CYAN}installzlibzlibdevel{RESET}yumyinstallmakezlibzlibdevelprintf{CYAN}installpcre{RESET}yumyinstallpcreprintf{GREEN}安装常见lib结束{RESET}系统检查脚本!usrbinenvbashconsolecolorCRESET(tputsgr0)CBLACK33〔1;30mCRED33〔1;31mCGREEN33〔1;32mCYELLOW33〔1;33mCBLUE33〔1;34mCPURPLE33〔1;35mCCYAN33〔1;36mCWHITE33〔1;37mprintf{CPURPLE}catEOF系统信息检查脚本EOFprintf{CRESET}〔〔(idu)gt0〕〕echo请用root用户执行此脚本!exit1sysversion(rpmqcentosreleasecutdf3)doublelineline打印头部信息printHeadInfo(){catEOF欢迎使用【系统信息检查脚本】EOF}打印尾部信息printFootInfo(){catEOF脚本执行结束,感谢使用!EOF}options(获取系统信息获取服务信息获取CPU信息获取系统网络信息获取系统内存信息获取系统磁盘信息获取CPU内存占用TOP10获取系统用户信息输出所有信息退出)printMenu(){printf{CBLUE}printf主菜单:foriin{!options〔〕};doindexexpr{i}1valexpr{index}2printf(02d)30s{index}{options〔i〕}if〔〔{val}eq0〕〕;thenprintffidoneprintf{CBLUE}请输入需要执行的指令:printf{CRESET}}获取系统信息getsystatusinfo(){sysos(unameo)sysrelease(catetcredhatrelease)syskernel(unamer)syshostname(hostname)sysselinux(getenforce)syslang(echoLANG)syslastreboot(whobawk{print3,4})sysruntime(uptimeawk{print3,4}cutd,f1)systime(date)sysload(uptimecutd:f5)catEOF【系统信息】系统:{sysos}发行版本:{sysrelease}系统内核:{syskernel}主机名:{syshostname}selinux状态:{sysselinux}系统语言:{syslang}系统当前时间:{systime}系统最后重启时间:{syslastreboot}系统运行时间:{sysruntime}系统负载:{sysload}EOF}获取CPU信息getcpuinfo(){PhysicalCPUs(grepphysicalidproccpuinfosortuniqwcl)VirtCPUs(grepprocessorproccpuinfowcl)CPUKernels(grepcoresproccpuinfouniqawkF:{print2})CPUType(grepmodelnameproccpuinfoawkF:{print2}sortuniq)CPUArch(unamem)catEOF【CPU信息】物理CPU个数:PhysicalCPUs逻辑CPU个数:VirtCPUs每CPU核心数:CPUKernelsCPU型号:CPUTypeCPU架构:CPUArchEOF}获取服务信息getserviceinfo(){portlisten(netstatlntupgrepvActiveInternet)kernelconfig(sysctlp2devnull)if〔〔{sysversion}gt6〕〕;thenserviceconfig(systemctllistunitfilestypeservicestateenabledgrepenabled)runservice(systemctllistunitstypeservicestaterunninggrep。service)elseserviceconfig(sbinchkconfiggrepE:on:启用columnt)runservice(sbinservicestatusallgrepErunning)ficatEOF【服务信息】{serviceconfig}{line}运行的服务:{runservice}{line}监听端口:{portlisten}{line}内核参考配置:{kernelconfig}EOF}获取系统内存信息getmeminfo(){checkmem(freem)MemTotal(grepMemTotalprocmeminfoawk{print2})KBMemFree(grepMemFreeprocmeminfoawk{print2})KBletMemUsedMemTotalMemFreeMemPercent(awkBEGIN{if(MemTotal0){printf100}else{printf。2f,MemUsed100MemTotal}})reportMemTotal((MemTotal1024))MB内存总容量(MB)reportMemFree((MemFree1024))MB内存剩余(MB)reportMemUsedPercent(freesedn2pgawkxint((32)100){printx}seds)catEOF【内存信息】内存总容量(MB):{reportMemTotal}内存剩余量(MB):{reportMemFree}内存使用率:{reportMemUsedPercent}EOF}获取系统网络信息getnetinfo(){priipadd(ipaddrawk〔09〕:{};inet。global{printgensub((。)(。),1,g,2)})pubipadd(curlifconfig。mes)gateway(iproutegrepdefaultawk{print3})macinfo(iplinkegrepvlogreplinkawk{print2})dnsconfig(egrepvetcresolv。conf)routeinfo(routen)catEOF【网络信息】系统公网地址:{pubipadd}系统私网地址:{priipadd}网关地址:{gateway}MAC地址:{macinfo}路由信息:{routeinfo}DNS信息:{dnsconfig}EOF}获取系统磁盘信息getdiskinfo(){diskinfo(fdisklgrepDiskdevcutd,f1)diskuse(dfhTPawk2!tmpfs{print})diskpercent(freesedn2pgawkxint((32)100){printx}seds)diskinode(dfhiPawk1!tmpfs{print})catEOF【磁盘信息】{diskinfo}磁盘使用:{diskuse}磁盘使用百分比:{diskpercent}inode信息:{diskinode}EOF}获取系统用户信息getsysuser(){loginuser(awkF:{if(NFbinbash)print0}etcpasswd)sshconfig(egrepv34;etcsshsshdconfig)sudoconfig(egrepv34;etcsudoersgrepvDefaults)hostconfig(egrepv34;etchosts)crondconfig(dols{cronuser}2devnullcutdf5;egrepv{cronuser}2done)catEOF【用户信息】系统登录用户:{loginuser}{line}ssh配置信息:{sshconfig}{line}sudo配置用户:{sudoconfig}{line}定时任务配置:{crondconfig}{line}hosts信息:{hostconfig}EOF}获取CPU内存占用TOP10getprocesstopinfo(){toptitle(topbn1head7tail1)cputop10(topbn1head17tail11)memtop10(topbn1head17tail10sortk10r)catEOF【TOP10】CPU占用TOP10:{cputop10}内存占用TOP10:{toptitle}{memtop10}EOF}showdeadprocess(){printf僵尸进程:psalgawk{print2,4}grepZ}getallinfo(){getsystatusinfoecho{doubleline}getserviceinfoecho{doubleline}getcpuinfoecho{doubleline}getnetinfoecho{doubleline}getmeminfoecho{doubleline}getdiskinfoecho{doubleline}getprocesstopinfoecho{doubleline}getsysuser}main(){while〔〔1〕〕doprintMenureadoptionlocalindex〔{option}1〕case{options〔{index}〕}in获取系统信息);获取服务信息);获取CPU信息);获取系统网络信息);获取系统内存信息);获取系统磁盘信息);获取CPU内存占用TOP10);获取系统用户信息);输出所有信息)getallinfosys。logprintf{CGREEN}信息已经输出到sys。log中。{CRESET};;退出);)clearecho抱歉,不支持此选项;;esacdone}MAINprintHeadInfomainprintFootInfoprintf{CRESET}sed进阶!binbash多个空格只保留一个sed。,!dtest删除开头的空白行sed。,!dtest删除结尾的空白行sed{:start{d;N;bstart}}test删除html标签有问题s。gseds〔〕gtest1seds〔〕g;dtest1and符号,代表替换命令中的匹配模式,不管预定义模式是什么文本,都可以用and符号替换,and符号会提取匹配替换命令中指定替换模式中的所有字符串echoThecatsleepsinhishatseds。atg替换单独的单词echoTheSystemAdministratormanualseds(System)Administrator1user在长数字中插入逗号echo1234567sed{:s(。〔09〕)(〔09〕{3})1,2;tstart}给文件中的行编号sedtestsedN;sLinuxCPU的上下文切换 我们都知道Linux是一个多任务操作系统,它支持的任务同时运行的数量远远大于CPU的数量。当然,这些任务实际上并不是同时运行的(SingleCPU),而是因为系统在短时间内将CPU轮流分配给任务,造成了多个任务同时运行的假象。CPU上下文(CPUContext) 在每个任务运行之前,CPU需要知道在哪里加载和启动任务。这意味着系统需要提前帮助设置CPU寄存器和程序计数器。 CPU寄存器是内置于CPU中的小型但速度极快的内存。程序计数器用于存储CPU正在执行的或下一条要执行指令的位置。 它们都是CPU在运行任何任务之前必须依赖的依赖环境,因此也被称为CPU上下文。如下图所示: 图片 知道了CPU上下文是什么,我想你理解CPU上下文切换就很容易了。CPU上下文切换指的是先保存上一个任务的CPU上下文(CPU寄存器和程序计数器),然后将新任务的上下文加载到这些寄存器和程序计数器中,最后跳转到程序计数器。 这些保存的上下文存储在系统内核中,并在重新安排任务执行时再次加载。这确保了任务的原始状态不受影响,并且任务似乎在持续运行。CPU上下文切换的类型 你可能会说CPU上下文切换无非就是更新CPU寄存器和程序计数器值,而这些寄存器是为了快速运行任务而设计的,那为什么会影响CPU性能呢? 在回答这个问题之前,请问,你有没有想过这些任务是什么?你可能会说一个任务就是一个进程或者一个线程。是的,进程和线程正是最常见的任务,但除此之外,还有其他类型的任务。 别忘了硬件中断也是一个常见的任务,硬件触发信号,会引起中断处理程序的调用。 因此,CPU上下文切换至少有三种不同的类型:进程上下文切换线程上下文切换中断上下文切换 让我们一一来看看。进程上下文切换 Linux按照特权级别将进程的运行空间划分为内核空间和用户空间,分别对应下图中Ring0和Ring3的CPU特权级别的。内核空间(Ring0)拥有最高权限,可以直接访问所有资源用户空间(Ring3)只能访问受限资源,不能直接访问内存等硬件设备。它必须通过系统调用被陷入(trapped)内核中才能访问这些特权资源。 图片 从另一个角度看,一个进程既可以在用户空间也可以在内核空间运行。当一个进程在用户空间运行时,称为该进程的用户态,当它落入内核空间时,称为该进程的内核态。 从用户态到内核态的转换需要通过系统调用来完成。例如,当我们查看一个文件的内容时,我们需要以下系统调用:open():打开文件read():读取文件的内容write():将文件的内容写入到输出文件(包括标准输出)close():关闭文件 那么在上述系统调用过程中是否会发生CPU上下文切换呢?当然是的。 这需要先保存CPU寄存器中原来的用户态指令的位置。接下来,为了执行内核态的代码,需要将CPU寄存器更新到内核态指令的新位置。最后是跳转到内核态运行内核任务。 那么系统调用结束后,CPU寄存器需要恢复原来保存的用户状态,然后切换到用户空间继续运行进程。 因此,在一次系统调用的过程中,实际上有两次CPU上下文切换。 但需要指出的是,系统调用进程不会涉及进程切换,也不会涉及虚拟内存等系统资源切换。这与我们通常所说的进程上下文切换不同。进程上下文切换是指从一个进程切换到另一个进程,而系统调用期间始终运行同一个进程 系统调用过程通常被称为特权模式切换,而不是上下文切换。但实际上,在系统调用过程中,CPU的上下文切换也是不可避免的。进程上下文切换vs系统调用 那么进程上下文切换和系统调用有什么区别呢?首先,进程是由内核管理的,进程切换只能发生在内核态。因此,进程上下文不仅包括虚拟内存、栈和全局变量等用户空间资源,还包括内核栈和寄存器等内核空间的状态。 所以进程上下文切换比系统调用要多出一步: 在保存当前进程的内核状态和CPU寄存器之前,需要保存进程的虚拟内存、栈等;并加载下一个进程的内核状态。 根据Tsuna的测试报告,每次上下文切换需要几十纳秒至微秒的CPU时间。这个时间是相当可观的,尤其是在大量进程上下文切换的情况下,很容易导致CPU花费大量时间来保存和恢复寄存器、内核栈、虚拟内存等资源。这正是我们在上一篇文章中谈到的,一个导致平均负载上升的重要因素。 那么,该进程何时会被调度切换到在CPU上运行?其实有很多场景,下面我为大家总结一下:当一个进程的CPU时间片用完时,它会被系统挂起,并切换到其他等待CPU运行的进程。当系统资源不足(如内存不足)时,直到资源充足之前,进程无法运行。此时进程也会被挂起,系统会调度其他进程运行。当一个进程通过sleep函数自动挂起自己时,自然会被重新调度。当优先级较高的进程运行时,为了保证高优先级进程的运行,当前进程会被高优先级进程挂起运行。当发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序。 了解这些场景是非常有必要的,因为一旦上下文切换出现性能问题,它们就是幕后杀手。线程上下文切换 线程和进程最大的区别在于,线程是任务调度的基本单位,而进程是资源获取的基本单位。 说白了,内核中所谓的任务调度,实际的调度对象是线程;而进程只为线程提供虚拟内存和全局变量等资源。所以,对于线程和进程,我们可以这样理解:当一个进程只有一个线程时,可以认为一个进程等于一个线程当一个进程有多个线程时,这些线程共享相同的资源,例如虚拟内存和全局变量。此外,线程也有自己的私有数据,比如栈和寄存器,在上下文切换时也需要保存。 这样,线程的上下文切换其实可以分为两种情况:首先,前后两个线程属于不同的进程。此时,由于资源不共享,切换过程与进程上下文切换相同。其次,前后两个线程属于同一个进程。此时,由于虚拟内存是共享的,所以切换时虚拟内存的资源保持不变,只需要切换线程的私有数据、寄存器等未共享的数据。 显然,同一个进程内的线程切换比切换多个进程消耗的资源要少。这也是多线程替代多进程的优势。中断上下文切换 除了前面两种上下文切换之外,还有另外一种场景也输出CPU上下文切换的,那就是中断。 为了快速响应事件,硬件中断会中断正常的调度和执行过程,进而调用中断处理程序。 在中断其他进程时,需要保存进程的当前状态,以便中断后进程仍能从原始状态恢复。 与进程上下文不同,中断上下文切换不涉及进程的用户态。因此,即使中断进程中断了处于用户态的进程,也不需要保存和恢复进程的虚拟内存、全局变量等用户态资源。 另外,和进程上下文切换一样,中断上下文切换也会消耗CPU。过多的切换次数会消耗大量的CPU资源,甚至严重降低系统的整体性能。因此,当您发现中断过多时,需要注意排查它是否会对您的系统造成严重的性能问题。结论 综上所述,无论哪种场景导致上下文切换,你都应该知道: CPU上下文切换是保证Linux系统正常运行的核心功能之一,一般不需要我们特别关注。 但是过多的上下文切换会消耗CPU的时间来保存和恢复寄存器、内核栈、虚拟内存等数据,从而缩短进程的实际运行时间,导致系统整体性能显着下降。