1.处理信号
Linux利用信号与运行在系统中的进程进行通信。
可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。
1.1 捕获信号
trap命令允许指定shell脚本要监看并从shell中拦截的Linux信号。
如果脚本收到了trap命令中列出的信号,该信号不再由shell处理,而是由本地处理。
格式:trap cmd signals
在trap命令行上,只要列出想要shell执行的命令,以及一组用空格分开的待捕获的信号。可以用数值或Linux信号名来指定信号。
1.2 捕获脚本退出
除了在shell脚本中捕获信号,也可以在shell脚本退出时进行捕获。这是在shell完成任务时执行命令的一种简便方法。
要捕获shell脚本的退出,只要在trap命令后加上EXIT信号就行。
如:
trap "echo Goodbye…" EXIT
当脚本运行到正常的退出位置时,捕获就被触发了,shell会执行在trap命令行指定的命令。如果提前退出脚本,同样能够捕获到EXIT。
2.以后台模式运行脚本
在后台模式运行shell脚本非常简单,只要在命令后加上‘&’就行。
3.在非控制台下运行脚本
在终端会话中启动脚本,然后让脚本一直以后台模式运行到结束,即使退出了终端会话。这可以用nohup命令来实现。
nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这样会在退出终端会话时阻止进程退出。
格式:nohup ./test1.sh &
4. 作业控制
启动,停止,终止,恢复作业的这些功能统称为作业控制。
通过作业控制就能完全控制shell环境中所有进程的运行方式了。
4.1 查看作业
jobs命令可以查看shell当前正在处理的作业。
格式:jobs
jobs命令使用一些不同的命令行参数:
参数 |
描述 |
|
1 |
-l |
列出进程的PID以及作业号 |
2 |
-n |
只列出上次shell发出的通知后改变了状态的作业 |
3 |
-p |
只列出作业的PID |
4 |
-r |
只列出运行中的作业 |
5 |
-s |
只列出已停止的作业 |
4.2 重启停止的作业
要以后台模式重启一个作业,可用bg命令加上作业号。
对于带'+'号的默认作业,可直接输入bg命令,不用带作业号。
要以前台模式重启作业,可用fg命令加作业号。
5.调整谦让度
在如Linux的多任务操系统中,内核负责将CPU时间分配给系统上运行的每个进程。
调度优先级是内核分配给进程的CPU时间。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的(0)。
调度优先级是个整数,从-20(最高优先级)到+19(最低优先级)。默认情况下,bash shell以优先级0来启动所有进程。
优先级越高,获得CPU的时间的机会越高。
5.1 nice命令
nice命令可以设置启动时的调度优先级。要让命令以更低的优先级运行,只要用nice的-n命令行来指定新的优先级级别:
格式:nice -n 10 ./test4.sh > test4.out &
注:必须将nice命令和要启动的命令放在同一行中。
要随意设置优先级,只需使用nice 加 -X命令即可:
nice -10 ./test4.sh > test4.out &
5.2 renice命令
renice命令设置系统上已运行命令的优先级。
renice命令也有一些限制:
- 只能对属于你的进程执行renice;
- 只能通过renice降低进程的优先级;
- root用户可以通过renice来任意调整进程的优先级;
6.定时运行作业
6.1 用at命令来计划执行作业
at命令允许指定Linux系统何时运行脚本。at命令会将作业提交到队列中,指定shell何时运行该作业。at的守护进程atd会以后台模式运行,检查作业队列来运行作业。大多数Linux发行版会在启动时运行此守护进程。
atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的作业。
默认情况下,atd守护进程会每60秒检查一下这个目录。有作业时,atd守护进程会检查作业设置运行的时间,如果时间跟当前时间匹配,atd守护进程就会运行此作业。
格式:
at [-f filename] time
at命令可以识别多种不同格式的时间。
列出等待的作业:atq
atq命令可以查看系统中有哪些作业在等待。
删除作业:atrm
一旦知道了哪些作业在作业队列中等待,就能用atrm命令来删除等待中的作业。
只要指定需要删除的作业号就行。
6.2 安排需要定期执行的脚本
Linux系统使用cron程序来安排要定期执行的作业。cron程序会在后台运行并检查一个特殊的表(被称作cron时间表),以获知已安排执行的作业。
(1)cron时间表
cron时间表采用一种特别的格式来指定作业何时运行:
min hour dayofmonth month dayofweek command
其中dayofweek: 周一到周日表示为(1,2,3,4,5,6,0)
(2)构建cron时间表
添加条目:crontab -e
列出cron时间表:crontab -l
(3)浏览cron目录
如果创建的脚本对精确的执行时间要求不高,用预配置的cron脚本目录会更方便。有四个基本目录:
hourly, daily, monthly, weekly
因此,如果脚本需要每天运行一次,只要将脚本复制到daily目录,cron就会每天执行它。
(4)anacron程序
如果某个作业在cron时间表中安排运行的时间已到,但这时候Linux系统处于关机状态,那么这个作业就不会被运行。当系统开机时,cron程序不会再去运行那些错过的作业。
anacron知道某个作业错过执行时间,它会尽快运行该作业。即当它再次开机时,原定在关机期间运行的作业会会自动运行。
anacron程序只会处理位于cron目录中的程序,同时anacron不会运行位于/etc/cron.hourly的脚本,因为anacron程序不会处理执行时间需求小于一天的脚本。