7.6 控制shell脚本

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程序不会处理执行时间需求小于一天的脚本。

上一篇:Linux 查看 cron 定时任务执行日志


下一篇:Linux定时任务