ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

7.6 控制shell脚本

2021-10-04 19:57:56  阅读:159  来源: 互联网

标签:脚本 shell 作业 cron 命令 7.6 运行


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

标签:脚本,shell,作业,cron,命令,7.6,运行
来源: https://blog.csdn.net/Qiu_SaMa/article/details/120607263

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有