当前位置: 首页 > Linux

Linux_《Linux命令行与shell脚本编程大全》第16章学习总结

时间:2023-04-06 01:30:46 Linux

时间:2017-09-26注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第16章学习总结第16章:控制脚本本章内容进程信号后台模式运行脚本禁止挂起作业控制修改脚本优先级脚本执行自动化16.1进程信号16.1.1重温Linux信号Linux系统信号Linux使用信号与系统中运行的进程进行通信。您可以使用信号来停止/启动/终止进程。您可以通过编写脚本来控制shell在接收到特定信号时执行特定命令。脚本默认情况下,bashshell忽略接收到的任何3和15信号,但bashshell处理1和2信号常见的Linux系统信号信号:值:描述1:SIGHUP:暂停进程2:SIGINT:终止进程3:SIGQUIT:停止进程9:SIGKILL:无条件终止进程15:SIGTERM:尽可能终止进程17:SIGSTOP:无条件停止进程,但不终止进程18:SIGTSTP:停止或挂起进程,但不终止进程19:SIGCONT:继续运行已停止的进程16.1.2产生信号1.中断进程使用Ctrl+C组合键产生一个2(SIGINT)信号,发送给shell中当前运行的所有进程执行命令sleep100^C注:^generation指的是Ctrl键2.暂停进程。使用Ctrl+Z组合键将生成一个18(SIGTSTP)信号来停止在shell中运行的任何进程。执行命令sleep100^Z。当按下Ctrl+Z组合键时,bashshell会给出如下提示[1]+Stoppedsleep100方括号中的数字是shell分配的作业号(jobnumber)。shell调用在shell中运行的每个进程一个作业,并为每个作业分配一个唯一的作业号。如果有Forastoppedjob,当你退出shell时,bash会提醒你使用常用的操作ps-l查看被停止的作业。在S列(进程状态)中,为停止的作业显示Tkill-9PIDtoterminatethejobwithspecifiedPID,终止停止作业的PID。通俗的说就是杀掉进程。16.1.3捕捉信号命令格式:trapcommandssignals命令说明:使用trap命令指定shell脚本要从shell监听和拦截的Linux信号使用trap命令忽略SIGINT信号编写test1.sh脚本#!/bin/bashtrap"echo'对不起!我有trapendCtrl-C'"SIGINTechoThisisatestscriptcount=1while[$count-le10]doecho"Loop#$count"sleep1count=$[$count+1]doneecho"Thisistheendofthetestscript"16.1.4捕获脚本退出捕获shell脚本的退出EXIT信号编写test2.sh脚本#!/bin/bashtrap"echoGoodbye..."EXITcount=1while[$count-le5]doecho"Loop#$count"sleep1count=$[$count+1]done16.1.5修改或者去掉capture修改信号捕获,脚本还是会按照原来的trap命令writetest3.shscript#!/bin/bash#trap"echo'Sorry..Ctrl+Cis被困。'"SIGINT#count=1while[$count-le5]doecho"Loop#$count"sleep1count=$[$count+1]done#trap"echo'我修改了陷阱!'"SIGINT#count=1while[$count-le5]doecho"Loop#$count"sleep1count=$[$count+1]done在陷阱和信号列表之间添加两个破折号删除已经设置的陷阱和恢复默认行为写入test3b。shscript#!/bin/bash#trap"echo'Sorry..Ctrl+Cistrapped.'"SIGINT#count=1while[$count-le5]doecho"Loop#$count"sleep1count=$[$count+1]done##移除陷阱--SIGINTTecho"Ijustremovedthetrap"#count=1while[$count-le5]doecho"Loop#$count"sleep1count=$[$count+1]doneknock:你也可以在trap命令后使用一个破折号来恢复信号的默认行为单破折号和双破折号都可以正常工作16.2在后台模式下运行脚本16.2.1在后台运行脚本在命令后添加一个符号以在后台模式下运行shell脚本编写test4.sh脚本#!/bin/bashcount=1while[$count-le10]dosleep1count=$[$count+1]done执行命令./test4.sh&然后显示[1]3231方括号中的作业号表示后台进程,后面的数字是进程ID(PID)的进程后台进程运行时,仍然会使用终端监视器显示STDOUT和STDERR消息编写test5.sh脚本#!/bin/bash#echo"Startthetestscript"count=1while[$count-le5]doecho"Loop#$count"sleep5count=$[$count+1]done#echo"Testscriptiscomplete"当脚本在后台运行时,脚本的输出输入命令和命令输出混合在一起,最好重定向后台运行的脚本的STDOUT和STDERR,避免输出乱七八糟16.2.2运行多个后台作业可以在命令处使用&符号启动多个后台作业lineprompt同时使用ps命令查看所有脚本的运行状态在终端会话中使用后台进程时要小心。退出终端时,后台进程也会退出16.2.3非控制台下运行脚本命令格式:nohup./test1.sh&command说明:使用nohup命令在终端会话中启动一个shell脚本,让脚本以后台模式运行直到结束。即使您退出终端会话,shell脚本仍会继续运行。执行命令nohup./test1.sh&catnohup.out来说明使用当nohup启动一个shell脚本时,该脚本将忽略终端会话发送的SIGHUP信号。由于nohup命令会解除终端与进程的关联,因此进程将不再与STDOUT和STDERR相关联。nohup命令会自动将STDOUT和STDERR的消息重定向到当前目录中名为nohup.out的文件中,如果使用nohup命令运行另一个脚本,脚本的输出将附加到现有的nohup.out中文件。16.4作业控制这些启动/停止/终止和恢复作业的功能统称为作业控制16.4.1查看作业使用jobs命令查看shell当前正在处理的作业,脚本$$变量显示分配给作业的PIDLinux系统脚本编写test10.sh脚本#!/bin/bash#echo"ScriptProcessID:$$"#count=1while[$count-le10]doecho"Loop#$count"sleep10count=$[$count+1]done#echo"Endofscript..."#执行命令./test10.sh>test10.out&viewjobsjobs查看jobPIDjobs-ljobs命令参数参数:描述-l:列出进程的PID和作业号-n:仅列出自shell最后一次通知以来状态已更改的作业-p:仅列出作业的PID-r:仅列出正在运行的作业-s:仅列出已停止的作业加上和作业命令输出中的减号带有加号的作业将被视为默认作业。使用作业控制命令时,如果在命令行中没有指定作业号,则该作业将被视为作业控制命令的操作对象。在任何时候,无论shell中有多少个作业正在运行,都只有一个带加号的作业和一个带减号的作业。16.4.2重新启动已停止的作业命令格式:bg作业编号命令描述:重新启动指定的作业inbackgroundmode命令格式:fgjobnumber命令描述:restartspecifiedjobinforegroundmode进程调度优先级是内核分配给该进程(相对于其他进程)的CPU时间。在Linux系统中,shell启动的所有进程的调度优先级默认是相同的。调度优先级是一个整数值,范围从-20(最高优先级)到+19(最低优先级)默认情况下,bashshell启动所有优先级为0的进程敲:最低值-20是最高优先级,并且最高值19是最低优先级,太容易记了。如果你搞糊涂了,就记住“好汉难做”这句话吧。值越“好”或越高,获得CPU时间的机会就越低。16.5.1nice命令使用nice命令-n参数指定新的优先级执行命令nice-n10./test4.sh>test4.out&查看作业信息ps-p3678-opid,ppid,ni,cmdnice-10./test4.sh>test4.out&ps-p3706-opid,ppid,ni,cmd16.5.2renice命令使用renice命令指定运行进程PID的优先级执行命令./test4。sh&ps-p3742-opid,ppid,ni,cmdrenice-n10-p3742ps-p3742-opid,ppid,ni,cmdrenice属于你的进程只能通过renice执行renice来降低进程的优先级.root用户可以通过renice任意调整进程的优先级。at[-ffilename]time命令说明:使用-f参数指定要执行的脚本文件的文件名,time参数指定何时运行各种不同的时间格式标准时分格式,如10:15AP/PM指示符,例如10:15PM具体可命名时间,例如现在、中午、午夜或下午茶时间(4PM)标准日期格式,例如MMDDYY、MM/DD/YY或DD.MM.YY文本日期,比如Junl4或者Dec25,加上你也可以指定时间增量而不加年份。当前时间+25min明天10:15PM10:15+7天2.获取作业的输出在Linux系统上运行时,显示不会与作业关联。Linux系统会将STDOUT或STDERR的输出通过邮件系统发送给用户编写test13.sh脚本#!/bin/bashecho"Thisscriptranat$(date+%B%d,%T)"echosleep5echo"Thisisthescriptend..."在-ftest13.sh处执行命令现在使用-M选项屏蔽job产生的输出信息,写入test13b.sh#!/bin/bashecho"Thisscriptranat$(date+%B%d,%T)">test13b.outecho>>test13b.outsleep5echo"Thisisthescriptend...">>test13b.out在-M-ftest13b.shnowcat处执行命令test13b.out3.Listwaitingjobsatq命令查看系统中有哪些作业在等待,显示作业列表,作业列表中显示作业编号,系统运行作业的日期和时间,作业队列4.删除作业命令格式:atrm作业号命令说明:使用atrm删除指定的作业16.6.2安排需要定时执行的脚本1.cronschedule命令格式:minhourdayofmonthmonthdayofweek命令说明:cron计划使用一种特殊的格式来指定作业何时运行格式描述dayofweek:文本(mon、tue、wed、thu、fri、sat、sun)或数值(0表示星期日,6表示星期六)dayofmonth:表示datevalueinthemonth(1~31)cron实例每天10:15运行一次Command1510***commandrunseveryMonday4:15PMCommand1516**1executescommand00121**commandruns每月最后一天中午12点每月第一天0012***if['date+%d-dtomorrow'=01];then;命令说明:每天中午12点检查是否是当月的最后一天,如果是,cron会运行这条命令执行命令1510***/home/zc/test/unit16/test4.sh>测试4.输出2。建立一个cronscheduleLinux提供了crontab来处理cronschedule,使用cronschedule运行定时任务命令格式:crontab-l命令说明:使用crontab-l列出现有的cronschedule3.浏览cron目录如果创建脚本不需要精确的执行时间,可以使用预先配置的cron脚本目录。四个基本目录hourly:每小时执行一次daily:每天执行一次monthly:每月执行一次weekly:每周执行命令ls/etc/cron.*ly4.anacronprogramcron程序只能保证定时作业在什么时候执行Linux系统上电。Linux系统在关机状态下,不会执行定时任务。Linux系统关闭,知道某个作业错过了执行时间。当Linux系统开启时,它会尽快运行作业。anacron程序只会处理位于cron目录下的程序,例如/etc/cron.monthly命令格式:perioddelayidentifiercommand命令描述:period定义作业运行的频率,以天为单位当创建新的shell时,bashshell将运行$HOME/.bashrc文件进行验证。在$HOME/.bashrc文件末尾添加:echo"I'minanewshell"并保存。关闭shell终端再重新打开shell终端,可以看到提示16.7小结本章主要讲解linux中的信号控制,后台模式执行脚本,指定时间执行脚本,修改脚本优先级等。