控制Shell脚本

一、处理信号

1) SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。

登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。

此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

9) SIGKILL
用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,

shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

17) SIGCHLD
子进程结束时, 父进程会收到这个信号。

如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。

18) SIGCONT
让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

20) SIGTSTP
停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

默认情况下, bash shell会忽略收到的任何SIGQUIT (3)和SIGTERM (5)信号(正因为这样,
交互式shell才不会被意外终止)。但是bash shell会处理收到的SIGHUP (1)和SIGINT (2)信号。

2.捕获信号

使用trap命令

trap commands singals

#捕获SIGINT
trap "Trapped Ctrl-C." SIGINT
#捕获脚本的退出
trap echo "Good-bye" EXIT
#删除捕获
trap -- SIGINT

二、后台模式运行脚本

./test.sh &

有时你会想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行到结束,即使你退
出了终端会话。这可以用nohup命令来实现。
nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会
话时阻止进程退出。

nohup ./test.sh &

由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUT和STDERR联系在一起。
为了保存该命令产生的输出, nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为
nohup.out的文件中。

在bash作业控制中,可以将已停止的作业作为后台进程或前台进程重启。前台进程会接管你
当前工作的终端,所以在使用该功能时要小心了。
要以后台模式重启一个作业,可用bg命令加上作业号。

要以前台模式重启作业,可用带有作业号的fg命令。

使用jobs命令可查看作业号。

三、调整谦让度

调度优先级是个整数值,从20(最高优先级)到+19(最低优先级)。默认情况下, bash shell
以优先级0来启动所有进程 。

1.使用nice命令来降低优先级

nice -n  ./test4.sh > test4.out &

有时你想改变系统上已运行命令的优先级。这正是renice命令可以做到的。它允许你指定
运行进程的PID来改变它的优先级。

$ ./test11.sh &
[]
$
$ ps -p -o pid,ppid,ni,cmd
PID PPID NI CMD
/bin/bash ./test11.sh
$
$ renice -n -p
: old priority , new priority
$
$ ps -p -o pid,ppid,ni,cmd
PID PPID NI CMD
/bin/bash ./test11.sh
$

renice命令会自动更新当前运行进程的调度优先级。和nice命令一样, renice命令也有一
些限制:
 只能对属于你的进程执行renice;
 只能通过renice降低进程的优先级;
 root用户可以通过renice来任意调整进程的优先级。
如果想完全控制运行进程,必须以root账户身份登录或使用sudo命令。

四、定时运行作业

1.使用at命令来执行计划作业

at命令允许指定Linux系统何时运行脚本。 at命令会将作业提交到队列中,指定shell何时运
行该作业。 at的守护进程atd会以后台模式运行,检查作业队列来运行作业。

atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的
作业。

命令格式:

at [ -f filename ] time

-f参数用来指定执行的脚本文件名,time参数指定执行时间,如果时间已过,第二天同时间执行。

at -f test.sh now
at -M -f ts.sh now
#列出在等待的作业
atq
#删除作业
atrm

2.安排需要定期执行的作业

1)cron时间表

cron时间表采用一种特别的格式来指定作业何时进行:

min hour monthday month weekday command

#每天10点15分运行
* * * /home/rich/test4.sh > test4out
#注意命令列表必须为绝对路径
#星期一15点16分运行
* * command
#关于每个月最后一天执行命令解决办法
* * * if [`date +%d -d tomorrow` = ] ; then ; command

如果你创建的脚本对精确的执行时间要求不高,用预配置的cron脚本目录会更方便。有4个
基本目录: hourly、 daily、 monthly和weekly。

ls /etc/cron.*ly

例如想要每天运行一次脚本,把脚本文件放入daily目录下即可。

2)anacron:错过运行时间仍然选择合适的时间运行

anacron程序只会处理位于cron目录的程序,比如/etc/cron.monthly。它用时间戳来决定作业
是否在正确的计划间隔内运行了。每个cron目录都有个时间戳文件,该文件位于/var/spool/
anacron

格式:period delay identifier command

注意, anacron不会运行位于/etc/cron.hourly的脚本。这是因为anacron程序不会处理执行时间
需求小于一天的脚本。

Shell脚本笔记(七)控制Shell脚本的更多相关文章

  1. shell学习笔记2---执行Shell脚本(多种方法)

    在新进程中运行 Shell 脚本 1) 将 Shell 脚本作为程序运行 切换到脚本所在位置(还要给脚本加上可执行权限) [mozhiyan@localhost demo]$ ./test.sh #执 ...

  2. shell脚本之流程控制

      shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...

  3. Learning The Bash Shell读书笔记(整理)

    最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...

  4. Shell脚本笔记(一)一些零碎的基础知识

    一些零碎的基础知识 一.认识Shell脚本 一)相关概念 Shell是一种命令解释器,作用是按次序执行(遇到子脚本,先执行子脚本的命令)用户输入的命令和程序. Shell脚本语言是弱类型语言,与其他脚 ...

  5. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  6. Linux Shell脚本编程-语句控制

    过程式编程语言bash脚本编程面向过程的编程  顺序执行:默认法则,按照顺序一条一条语句执行  选择执行:分支,条件判断,符合条件的分支予以执行  循环执行:将同一段代码反复执行有限次,所以循环必须有 ...

  7. Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  8. 《Linux命令行与shell脚本编程大全》- 读书笔记3 - 理解shell

    当用户登录终端的时候,通常会启动一个默认的交互式shell.系统究竟启动哪个shell,这取决于用户配置.一般这个shell都是/bin/shell.默认的系统shell(/bin/sh)用于系统sh ...

  9. Shell脚本笔记(六)呈现数据

    呈现数据 一.文件描述符 Linux系统将每个对象当做文件处理,这包括输入和输出进程.Linux用文件描述符来标识每个文件对象.每个进程最多可以有9个 文件描述符,bash shell保留了前三个文件 ...

随机推荐

  1. CF1019C

    好玄学的东西... 核心思想:for循环! 首先,我们从前向后扫所有的点,如果这个点没被标记成不可用就把这个点标记成已使用,然后把所有与这个点直接相连的点标记成不可用 接下来,我们从后向前扫所有的点, ...

  2. noip 初赛复习重点知识点

    一.进制转化 将k进制数转化为十进制数: 设k进制数为(abcd)k,则对应十进制数为 (小数同理,乘k的负幂次) 将十进制数转成k进制数: 设十进制数为x: t1=x/k,t2=x mod k t1 ...

  3. python 图片相似度

    def pil_image_similarity(filepath1, filepath2): from PIL import Image from functools import reduce i ...

  4. Oracle索引(Index)介绍使用

    1.什么是引 索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据:Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引:索引由根节点.分支节点和叶子 ...

  5. Ubuntu安装TensorFlow

    使用清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/ 下载. 在主界面右侧找到[相关链接]->[使用帮助],然后在出现的页面左侧找到Tensor ...

  6. innobackupex做MySQL增量备份及恢复

    http://www.cnblogs.com/paul8339/p/6731688.html

  7. 发送Json数据,WebApi查看时为Null的问题(已解决)

     1. PostMan :发送请求的Body中选择form-data是不行的.,body中的内容也要选择raw json格式.   2.如果是代码中填写的对象,api中解析为null,说明字段的值未对 ...

  8. vue中methods一个方法调用另外一个方法

    转自http://blog.csdn.net/zhangjing1019/article/details/77942923 vue在同一个组件内: methods中的一个方法调用methods中的另外 ...

  9. 重排DL

    题解: https://www.luogu.org/problemnew/show/T51442 从这题上还是学到不少东西.. 以前并没有写过ex-bsgs 正好拿这个复习中国剩余定理和bsgs了(我 ...

  10. 【Android】Android 代码判断是否获取ROOT权限(二)

    [Android]Android 代码判断是否获取ROOT权限 方法比较简单,直接粘贴代码 /** * 判断当前手机是否有ROOT权限 * @return */ public boolean isRo ...