1处理信号

1.1信号表

编号

信号名称

缺省操作

解释

1

SIGHUP

Terminate

挂起控制终端或进程

2

SIGINT

Terminate

来自键盘的中断

3

SIGQUIT

Dump

从键盘退出

4

SIGILL

Dump

非法指令

5

SIGTRAP

Dump

跟踪的断点

6

SIGABRT

Dump

异常结束

6

SIGIOT

Dump

等价于SIGABRT

7

SIGBUS

Dump

总线错误

8

SIGFPE

Dump

浮点异常

9

SIGKILL

Terminate

强迫进程终止

10

SIGUSR1

Terminate

对进程可用

11

SIGSEGV

Dump

无效的内存引用

12

SIGUSR2

Terminate

对进程可用

13

SIGPIPE

Terminate

向无读者的管道写

14

SIGALRM

Terminate

实时定时器时钟

15

SIGTERM

Terminate

进程终止

16

SIGSTKFLT

Terminate

协处理器栈错误

17

SIGCHLD

Ignore

子进程停止、结束或在被跟踪时获得信号

18

SIGCONT

Continue

如果已停止则恢复执行

19

SIGSTOP

Stop

停止进程执行

20

SIGTSTP

Stop

从tty发出停止进程

21

SIGTTIN

Stop

后台进程请求输入

22

SIGTTOU

Stop

后台进程请求输出

23

SIGURG

Ignore

套接字上的紧急条件

24

SIGXCPU

Dump

超过CPU时限

25

SIGXFSZ

Dump

超过文件大小的限制

26

SIGVTALRM

Terminate

虚拟定时器时钟

27

SIGPROF

Terminate

概况定时器时钟

28

SIGWINCH

Ignore

窗口调整大小

29

SIGIO

Terminate

I/O现在可能发生

29

SIGPOLL

Terminate

等价于SIGIO

30

SIGPWR

Terminate

电源供给失败

31

SIGSYS

Dump

坏的系统调用

31

SIGUNUSED

Dump

等价于SIGSYS

1.2捕获信号

rap命令允许你来指定shell 脚本要监看并从shell中拦截的Linux信号。trap命令的格式是:

trap commands signals

其中commands你是要执行的操作,sianals是信号(可以是信号名,也可以是信号编号)

这里有个简单例子,展示了如何使用trap命令来忽略SIGINT信号,并控制脚本的行为。

$ cat test1.sh
#!/bin/bash
# Testing signal trapping
# trap "echo ' Sorry! I have trapped Ctrl-C'" 2
# echo This is a test script
# count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
echo "This is the end of the test script"

本例中用到的trap命令会在每次检测到SIGINT(2)信号时显示一行简单的文本消息。捕获这些信号会阻止用户用bash shell组合键Ctrl+C来停止程序。

$ ./test1.sh
This is a test script
Loop #
Loop #
^C Sorry! I have trapped Ctrl-C
Loop #
^C Sorry! I have trapped Ctrl-C
Loop #
Loop #
This is the end of the test script $

每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是处理该信号并允许shell停止该脚本。

1.3 捕获脚本退出

除了在shell脚本中捕获信号,你也可以在shell脚本退出时进行捕获。要捕获shell脚本的退出,只要在trap命令后加上EXIT信号就行:

$ cat test2.sh
#!/bin/bash
# Trapping the script exit
trap "echo Goodbye..." EXIT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done $ ./test2.sh
Loop #
Loop #
Loop #
Goodbye...

当脚本运行到正常的退出位置时或者是提退出,捕获就被触发了,shell会执行在trap命令行指定的命令。

1.4修改或移除捕获

要想在脚本中的不同位置进行不同的捕获处理,只需重新使用带有新选项的trap命令:

$ cat test3.sh
#!/bin/bash
# Modifying a set trap
trap "echo ' Sorry... Ctrl-C is trapped.'" 2
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
trap "echo ' I modified the trap!'" 2
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done

修改了信号捕获之后,脚本处理信号的方式就会发生变化。但如果一个信号是在捕获被修改前接收到的,那么脚本仍然会根据最初的trap命令进行处理。

$ ./test3.sh
Loop #
Loop #
Loop #
^C Sorry... Ctrl-C is trapped.
Loop #
Loop #
Second Loop #
Second Loop #
^C I modified the trap!
Second Loop #
Second Loop #
Second Loop #

也可以删除已设置好的捕获。只需要在trap命令与希望恢复默认行为的信号列表之间加上破折号(-或者--)就行了:

$ cat test3b.sh
#!/bin/bash
# Removing a set trap
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done # Remove the trap
trap -- SIGINT
echo "I just removed the trap"
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done $ ./test3b.sh
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
I just removed the trap
Second Loop #1
Second Loop #2
Second Loop #3
^C

2以后台模式运行脚本

2.1后台运行脚本

以后台模式运行shell脚本非常简单。只要在命令后加个&符就行了。$ cat test4.sh

#!/bin/bash
# Test running in the background
count=1
while [ $count -le 10 ]
do
sleep 1
count=$[ $count + 1 ]
done $ ./test4.sh &
[1] 3231

显示的第一行是:

[1] 3231

方括号中的数字是shell分配给后台进程的作业号。下一个数是Linux系统分配给进程的进程ID(PID)。Linux系统上运行的每个进程都必须有一个唯一的PID。

一旦系统显示了这些内容,新的命令行界面提示符就出现了。你可以回到shell,而你所执行的命令正在以后台模式安全的运行。这时,你可以在提示符输入新的命令

当后台进程结束时,它会在终端上显示出一条消息:

[1]   Done                    ./test4.sh

这表明了作业的作业号以及作业状态(Done),还有用于启动作业的命令。

注意,当后台进程运行时,它仍然会使用终端显示器来显示STDOUT和STDERR消息。所以最好将消息重定向,不然会导致屏幕信息混乱。

2.2运行多个后台作业

可以在命令行提示符下同时启动多个后台作业。

$ ./test6.sh &
[1] 3568
$ This is Test Script # $ ./test7.sh &
[2] 3570
$ This is Test Script # $ ./test8.sh &
[3] 3573
$ And...another Test script $ ./test9.sh &
[4] 3576
$ Then...there was one more test script

每次启动新作业时,Linux系统都会为其分配一个新的作业号和PID。通过ps命令,可以看到所有脚本处于运行状态。

$ ps
PID TTY TIME CMD
2431 pts/0 00:00:00 bash
3568 pts/0 00:00:00 test6.sh
3570 pts/0 00:00:00 test7.sh
3573 pts/0 00:00:00 test8.sh
3574 pts/0 00:00:00 sleep
3575 pts/0 00:00:00 sleep
3576 pts/0 00:00:00 test9.sh
3577 pts/0 00:00:00 sleep
3578 pts/0 00:00:00 sleep
3579 pts/0 00:00:00 ps

注意,在ps命令的输出中,每一个后台进程都和终端会话(pts/0)终端联系在一起。如果终端会话退出,那么后台进程也会随之退出。

3       在非控制台下运行脚本

nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会话时阻止进程退出。

nohup命令的格式如下:

$ nohup ./test1.sh & 
[1] 3856
$ nohup: ignoring input and appending output to 'nohup.out'

和普通后台进程一样,shell会给命令分配一个作业号,Linux系统会为其分配一个PID号。区别在于,当你使用nohup命令时,如果关闭该会话,脚本会忽略终端会话发过来的SIGHUP信号。 6由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUT和STDERR联系在一起。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中。

在进程完成运行后,你可以查看nohup.out文件中的输出结果:

$ cat nohup.out
This is a test script
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Loop 10
This is the end of the test script

Shell编程—控制脚本的更多相关文章

  1. Shell编程(脚本)的经常使用命令和语句

    一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...

  2. Shell编程-12-Shell脚本规范及调试

    目录 Shell脚本规范 Shell脚本调试 Shell脚本规范     良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...

  3. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

  4. Shell编程—基础脚本

    1. 使用多个命令 如果要两个命令或者多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. 2. 创建 shell 脚本文件 例如: #!/bin/bash # This script dis ...

  5. shell编程之脚本参数$@,$*,$#,$$,$?的含义

    #首先按顺序解释各个参数的含义 1.$0  表示脚本的文件名, 具体的路径信息和执行命令时的相对位置有关,例如 sakura@mi-OptiPlex-7050:~/sh$ sh args.sh arg ...

  6. [shell编程] sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory

    转载地址:http://www.cnblogs.com/pipelone/archive/2009/04/17/1437879.html 在Linux中执行.sh脚本,异常/bin/sh^M: bad ...

  7. shell编程第一天

    shell编程基础 脚本:简单来说就是一条条的文字命令(一些指令的堆积)Shell属于内置的脚本 1.程序开发效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 2.语法简单,代码写起来 ...

  8. Linux命令行和shell编程

    Shell Shell是一个程序,用户输入的命令通过shell来传达给内核或其它程序.用户在linux打开一个终端,终端就会自动调用用户的shell. Linux上的Shell有很多种,用的最多是sh ...

  9. 《Linux命令行与shell脚本编程大全》第十六章 控制脚本

    一些控制脚本的方式:向脚本发送信号.修改脚本优先级,在脚本运行时切换到运行模式 16.1 处理信号 linux利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...

随机推荐

  1. Spring Cache缓存注解

    目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...

  2. STL入门--sort,lower_bound,upper_bound,binary_search及常见错误

    首先,先定义数组 int a[10]; 这是今天的主角. 这四个函数都是在数组上操作的 注意要包含头文件 #include<algorithm> sort: sort(a,a+10) 对十 ...

  3. 17条嵌入式C语言编程小知识总结

    流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令). 如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满.因此,尽量少的使用跳转指令可以提高程序执 ...

  4. Python os.open() 方法

    概述 os.open() 方法用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777.高佣联盟 www.cgewang.com 语法 open()方法语法格式如下: ...

  5. Python Tuple(元组) cmp()方法

    描述 Python 元组 cmp() 函数用于比较两个元组元素.高佣联盟 www.cgewang.com 语法 cmp()方法语法: cmp(tuple1, tuple2) 参数 tuple1 -- ...

  6. PHP curl_multi_setopt函数

    (PHP 5 >= 5.5.0) curl_multi_setopt — 设置一个批处理cURL传输选项. 说明 bool curl_multi_setopt ( resource $mh , ...

  7. PHP date_parse_from_format() 函数

    ------------恢复内容开始------------ 实例 根据指定的格式返回一个包含指定日期信息的关联数组: <?phpprint_r(date_parse_from_format(& ...

  8. electron开发 - mac平台的打包和签名 - 针对electron-builder的自动更新

    配合自动更新 - 安装包签名(mac)(待补充) 前提:实现自动更新需要签名 一.本地开发调试mac签名(无需具有权限的appple账号) 打开xcode,xcode -> preference ...

  9. 无法加载文件或程序集“System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”

    原因是:System.Net.Http.dll 使用了net4.6的版本的.而System.Net.Http.Formatting.dll使用了4.5的版本. 解决方案:将webconfig文件下的n ...

  10. 使用免费证书安装 ipa 到真机

    使用免费证书安装 ipa 密码设置 进入 AppleId 官网 登录个人账号 登录进去之后, 找到 Security, 点击 Generate Password... 锁边输入几个字符, 再点击 Cr ...