文档章节

第5章 脚本控制------------------------(处理信号、常用信号、捕获信号、移除捕获)

henni_719
 henni_719
发布于 2017/04/22 17:23
字数 1843
阅读 22
收藏 0

5章 脚本控制

         到目前为止,运行脚本的唯一方法是以实时模式直接从命令行界面运行。这不是在Linux系统中运行脚本的唯一方式。还有许多可用的其他选项可以在Linux系统上运行shell脚本。本章将研究用于运行代码的各种不同方式。另外,有时脚本会遇到循环终止问题,需要找出如何在不关闭Linux系统的情况下停止这段脚本。本章将控制shell脚本在系统中的运行方式以及运行时间的不同方法。

5.1处理信号

         Linux使用信号与系统上运行的进程进行通信。前面介绍了,不同的Linux信号,以及Linux如何使用这些信号停止、启动和终止进程。也可已使用这些信号控制Shell脚本的运行,只需要让shell脚本在接收到来自Linux系统的特定信号时执行命令即可。

5.1.1 Linux信号回顾

         系统和应用程序可以生产30多个Linux信号。下表给出最常见的Linux系统信号。

        

         默认情况下,bash shell会忽略它接收的任何SIGQUIT信号、SIGTERM信号(以防止交互的shell意外终止)。但是,bashshell处理它收到的任何SIGHUP、SIGINT信号

         如果bash shell收到一个SIGHUP信号,它会退出。在退出之前,它将SIGHUP信号传递给shell启动的任意进程(如shell脚本)。收到SIGINT信号,shell会立即中断。Linux内核停止向shell提供CPU 上的处理时间。这种情况下,shell将SIGINT信号传递给由shell启动的人任意进程以通知它们这种情况。

         默认的shell脚本行为将忽略这些信号,这样会对脚本运行产生不良影响。为避免这种情况发生,对脚本进行编程以识别信号,并执行命令以便脚本为信号结果做好准备。

5.1.2 生成信号

         Bashshell可以使用键盘上的组合键生成两个基本的Linux信号。如果需要停止或暂停失控的程序,那么这个功能会被用上。

         1.中断进程

         使用Ctrl+C组合键可以生成SIGINT信号,并将其发送给当前正在shell中运行的任意进程。运行一个通常需要很长时间才能完成的命令并按Ctrl+C组合键,可以测试此操作。

         Ctrl+C组合键不会在监视器上生成任何输出,它只会停止当前在shell中运行的进程。sleep命令在指定的秒数之内暂停操作通常,命令提示符在计时器过期之前不会返回。在计时器过期之前按Ctrl+C组合键,可以使sleep命令提前终止。

        

         2.暂停进程

         Ctrl+Z组合键生成SIGSTP信号,可以停止任何在shell中运行的进程。停止进程与终止进程不同,停止进程后程序任然留在内存中,能够从停止的地方继续运行。操作实例:

        

         方括号中的数字是shell分配的作业编号(jobnumber)。shell以作业(job)形式引用shell中运行的每个进程,向每个作业分配唯一的作业编号。它向第一个启动的进程分配作业编号1,向第二进程分配作业编号2,以此类推。如果shell会话中有一个停止的作业,在退出shell时bash将发出警告。使用ps命令查看停止的作业:

        

         ps命令选项说明:

        

         如果想在停止作业仍处于活动状态时退出shell,只需要再次键入exit命令。shell将退出,并终止亭子的作业。还有一种方法是知道停止作业的PID,使用kill命令发送SIGKILL信号来终止它。

        

         终止作业时,最初不会得到任何响应。但是,下一次使用某个生成shell提示符时,将会看到一条消息,指示已经终止了作业。每次在shell生成提示符时,它将显示shell中已经更改了状态的作业的状态。

         3.捕获信号

         除了可以使脚本忽略信号之外,还可以在信号出现时捕获信号和执行其他命令。trap命令可以指定能够通过shell脚本监控和拦截的Linux信号。如果脚本收到trap命令中列出的信号,它将保护该信号不被shell处理,并在本地处理它。trap命令格式:trap commands signals。在trap命令行中,只需要列出希望shell执行的命令,以及希望捕获的信号列表(以空格分隔)。指定信号可以通过它们的数值或Linux信号名实现。

         trap操作实例:        

#!/bin/bash
#使用trap命令捕获信号和执行命令

#trap "echo Haha" SIGINT SIGTERM
trap "echo Haha" 2 15
echo "This is a test program"
count=1
while [ $count -le 3 ]
do
     #在屏幕上输出循环次数
     echo "Loop #$count"
     #延迟10秒然后执行下一条命令
     sleep 10
     count=$[ $count+1 ]
done

echo "This is the end of the test program"

         当每次检测到SIGINT和SIGTERM信号时显示一个简单的文本消息。如果捕获到这些信号,在用户试图使用bash shell键盘Ctrl+C命令停止程序时,脚本将不受影响。每次使用Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,而不是忽略信号并允许shell停止脚本

         4.捕获脚本退出   

         除了在shell脚本中捕获信号之外,可以在shell脚本退出时捕获它们。这是一种在shell完成作业时执行命令的便捷方式。要捕获shell脚本退出,只需要向trap命令添加EXIT信号。   

#!/bin/bash
#使用trap命令捕获信号和执行命令

trap "echo Exit the shell script!" exit
echo "This is a test program"
count=1
while [ $count -le 3 ]
do
     #在屏幕上输出循环次数
     echo "Loop #$count"
     #延迟10秒然后执行下一条命令
     sleep 3
     count=$[ $count+1 ]
done

echo "This is the end of the test program"
     

         当脚本到达常规退出点时,就会触发trap,shell将执行在trap命令行中指定的命令如果提前退出脚本,也能够捕获EXIT。使用Ctrl+C组合键发送SIGINT信号时,脚本退出,但是在脚本退出之前,shell将执行trap命令。

         5.移除捕获

         要移除捕获,使用破折号作为命令和想要恢复正常行为的信号列表。 

#!/bin/bash
#使用trap命令捕获信号和执行命令
#使用trap命令移除捕获的命令信号

trap "echo Exit the shell script!" exit
echo "This is a test program"
count=1
while [ $count -le 3 ]
do
     #在屏幕上输出循环次数
     echo "Loop #$count"
     #延迟10秒然后执行下一条命令
     sleep 3
     count=$[ $count+1 ]
done
#移除对exit的捕获
echo "移除对exit的捕获!"
trap - exit
echo "This is the end of the test program"

         信号捕获移除后,脚本将忽略信号。但是,如果在移除捕获之前收到信号,脚本仍将根据trap命令处理该信号。

 

本文转载自:http://blog.csdn.net/henni_719/article/details/53670766

henni_719
粉丝 2
博文 466
码字总数 343938
作品 0
信阳
QA/测试工程师
私信 提问
脚本运行控制

Linux通过信号在运行在系统的进程之间通信,用信号来停止启动及无条件终止进程。同样也可以用信号来控制shell脚本的运行。 1.Linux系统信号 Linux系统和应用程序可以生成30多个信号,最常见的...

Caishu
2016/05/20
341
0
JNI Crash:异常定位与捕获处理

关键词:JNI Crash,异常检测,信号量捕获 在Android JNI开发中,经常会遇到JNI崩溃的问题,尤其带代码量大,或者嵌入了第三方代码的情况下,很难进行问题定位和处理。本文将介绍两种常见的J...

JackMeGo
2018/07/06
0
0
linux中的信号2——进程如何处理信号?

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。 1、signal函数介绍 (1)举例:用signal函数处理SIGINT信号(这个信号由ctrl+c时发出) 默认处理 忽略处理 捕获...

oqqhutu12345678
2017/07/15
0
0
谈shell之信号捕捉及处理

Shell 中常用的几个信号 在64位系统上,执行kill –l 命令可以看到几乎所有的信号[shell@u ~]$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGF...

123yph321
2013/07/16
0
0
Spark源码分析之Spark Shell(下)

继上次的Spark-shell脚本源码分析,还剩下后面半段。由于上次涉及了不少shell的基本内容,因此就把trap和stty放在这篇来讲述。 上篇回顾:Spark源码分析之Spark Shell(上) 总结一下,上面的...

青夜之衫
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部