脚本控制

脚本控制

13.1 处理信号

13.1.1 Linux信号回顾

       可以使用kill –l查看linux的信号集。

13.1.2 生成信号

       平时我们使用的CTRL+C就为发送了SIGINT信号;而CTRL+Z为生成了SIGTSTP信号,停止进程而不终止进程,停止进城后程序仍然爱留在内存中,能够从停止的地方继续运行。

13.1.3 捕获信号

       可以使用trap commands signals来捕获信号并拦截,如果脚本收到在trap命令中列出的信号,它将保护该信号不被shell处理。

       例如

       trap “echo haha” SIGINT SIGTERM,在该shell遇到两个信号时只是打印出haha而不会终止程序。

13.1.4 捕获脚本退出

       与上述相同,比如trap “echo haha” EXIT就会捕获退出信号,就算是CTRL+C也会捕获该信号。

13.1.5 移除捕获

       可以使用trap – signal来溢出捕获,但是如果在移除捕获之前收到了信号,脚本仍将根据trap命令处理该信号。

13.2 以后台模式运行脚本

13.2.1 以后台模式运行

       命令后添加&即可后台运行。

13.2.3 退出终端

       需要注意的是,运行后台进程的终端如果关闭的话,所有的后台进程也将退出。

13.3 在不使用控制台的情况下运行脚本

$nohup ./testshell &

nohup命令运行另一个命令阻塞发送到进程的任何SIGHUP信号,这可以防止在退出终端会话时退出进程。

13.4 作业控制

       重启、停止、终止和恢复作业的操作称为作业控制job control

13.4.1 查看作业

       命令jobs输出的信息中带有加号+的作业被视为默认作业,带有减号的作业是在处理完当前默认作业之后将称为默认作业的作业。在某一个时间点,无论shell中运行了多少作业,只能有一个带有加号+的作业,也只能有一个带有减号的作业。

13.4.2 重新启动停止的作业

       以后台模式启动bg n,以前台模式启动fg n,其中n为作业的编号。

13.5 变得更好

       默认情况下,从shell启动的所有进程在linux系统上的调度优先级scheduling priority都相同,为0。调度优先级的范围为从-20(最高优先级)到20(最低优先级)。

13.5.1 nice命令

       nice命令可以在启动命令时设置它的调度优先级。不过只能让命令在更低的优先级下运行,而不能调高优先级。这是一个安全特性,防止用户以高优先级启动所有命令。

       格式为 : nice –n N command

13.5.2 renice命令

       格式为renice N –p PID ,其中N为想调至的优先级参数。

       命令renice可以指定运行进程的PID以更改优先级。与nice命令一样,renice命令也有几个限制:

 

l  只能对拥有的进程使用renice命令;

l  只能使用renice命令将进程调制更低的优先级;

l  跟用户可以使用renice命令敬爱那个任何进程调至任何优先级。

13.6 准确无误地运行

13.6.1 使用at命令调度作业

       at命令运行指定linux系统运行脚本的时间。at命令将作业提交到一个队列,并指示shell在何时运行该作业。另一个命令atd以后台模式运行,并检查作业队列以运行作业。

       atd命令检查系统上的特殊目录,通常是/var/spool/at,以便运行使用at命令提交的作业。

       at命令的格式很简单:

       at [-f filename] time :其中filename为希望执行的脚本文件,time为希望运行的时间。其中time的方式可以发挥你的创造性了。

       使用at命令时,作业将提交到作业队列job queue中,有26中不同的作业队列可用于不同的优先级水平。使用小写字母az引用作业队列。

       默认情况下,所有的at作业都提交到作业队列a,即最高的优先级队列。如果希望以较低的优先级运行作业,可以使用-q参数指定字母。

       默认情况下,at作业完成后,不会再显示器显示任何内容,但是系统将生成一个电子邮件信息。

       使用atq命令可以查看系统中排队的作业。

       可以使用atrm N命令移除排队的作业,其中N为作业编号。

13.6.2 使用batch命令

       命令batchat稍有不同,batch命令的作用不是安排脚本在预设的时间运行,而是安排脚本在系统使用率低时运行

       如果linux系统正处于高负载水平,batch命令将延迟提交作业的运行,直到系统负载减低为止。这对于服务器是个良好的特性,因为服务器在白天和夜晚的负载水平可能大不相同。batch会检查linux系统当前的平均负载水平,如果平均负载低于0.8,它将运行在作业队列中的作业。

       batch命令的格式与at类似:

       batch [-f filename] [time]

13.6.3 调度定期脚本

       Linux系统中的cron程序可以调度需要定期运行的饿作业,cron程序在后台运行,它从特殊表格(cron表格)中查找需要调度运行的作业。

       cron表格的格式如下:

min hour dayofmonth month dayofweek command

       可以使用crontab –l查看现有的cron表格。

       对于cron存在的问题是,如果系统处于关闭状态,作业将无法执行。而anacron程序使用时间戳确定调度的作业是够在正确的时间间隔运行,如果确实错过了该作业的调度运行时间,它将尽快自动运行改作业。这意味着,如果Linux系统关闭了好几天,当它再次开启时,任何计划在系统关闭器件运行的作业都将自动运行。

       anacron表格的格式稍微不同于cron表格的格式:

period delay identifier command

13.7 从头开始

13.7.1 在启动时启动脚本

       可以写入rc脚本中,随系统一起启动。

13.7.2 随新shell一起启动

       写入.bashrc或者.bash_profile中,随着打开shell时启动。