linux 信号4非法指令,自学Linux Shell15.1-处理信号

15.1-处理信号

Linux使用信号与系统上运行的进程进行通讯。

可使用这些信号控制Shell脚本的运行,只须要让shell脚本在接收到来自Linux系统的特定信号时执行命令便可。shell

1. 经常使用的Linux信号

编号编程

信号名称安全

缺省操做bash

解释测试

POSIXspa

1命令行

SIGHUP3d

Terminatehtm

挂起控制终端或进程

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

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

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

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

2. 生成信号

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

2.1 中断进程

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

Ctrl+C组合键不会在监视器上生成任何输出,它只会中止当前在shell中运行的进程。sleep命令在指定的秒数以内暂停操做。

一般,命令提示符在计时器过时以前不会返回。在计时器过时以前按Ctrl+C组合键,可使sleep命令提早终止。

aef981748d44e21675d05fe7a168642e.png

2.2 暂停进程

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

6af8c5884ac712f64675dcc5b48e3e96.png

方括号中的数字是shell分配的做业编号(jobnumber)。

shell以做业(job)形式引用shell中运行的每一个进程,向每一个做业分配惟一的做业编号。

它向第一个启动的进程分配做业编号1,向第二进程分配做业编号2,以此类推。

若是shell会话中有一个中止的做业,在退出shell时bash将发出警告。使用ps命令查看中止的做业:

fc91330ed347d63cf68591fb23e2cbba.png

在S列(进程状态),ps命令将已中止做业的状态显示为T

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

a98bb2e5bd8a264d948b24610cf44fb4.png

2.3 捕获信号

除了可使脚本忽略信号以外,还能够在信号出现时捕获信号和执行其余命令。

trap命令能够指定可以经过shell脚本监控和拦截的Linux信号。若是脚本收到trap命令中列出的信号,它将保护该信号不被shell处理,并在本地处理它。

trap命令格式:trap commands signals。在trap命令行中,只须要列出但愿shell执行的命令,以及但愿捕获的信号列表(以空格分隔)。指定信号能够经过它们的数值或Linux信号名实现。

45f41eb91d05c8f108ed65045387d5b0.png

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

2.4 捕获脚本退出

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

0169bc7295de6643a06e6a8b03f249e5.png

当脚本到达常规退出点时,就会触发trap,shell将执行在trap命令行中指定的命令。

若是提早退出脚本,也可以捕获EXIT。使用Ctrl+C组合键发送SIGINT信号时,脚本退出,可是在脚本退出以前,shell将执行trap命令。

2.5 移除捕获

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

06610d71d5bc3dce6252360e98c26784.png

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

3. 后台模式下运行脚本

使用ps命令,能够查看Linux系统上运行的进程。全部进程不在终端监视器上运行。这就是所谓的后台运行进程。在后台模式中,进程运行时与终端会话STDIN、STDOUT和STDERR无关。

经过命令行界面之后台模式运行shell界面,只须要在命令后加上一个&符号。将&符号放在命令以后时,它将bashshell与命令相分离,并以独立的后台进程形式在系统上运行。

显示的一行相似:[1]  19555,方括号的数字是shell分配给后台的做业编号。后面的数字是LInux系统分配给进程的PID。全部Linux系统上运行的进程都必须有惟一的PID。

系统显示这些条目以后,将出现一个新的命令行界面提示符。执行的命令将之后模式安全运行。

这是,能够在提示符处输出新的命令,可是后台进程仍在运行,任然使用终端监视器显示STDOUT和STDERR消息。

后台进程结束时,在终端显示消息格式:[1]+ Done       ./test  这表示做业编号和做业状态(Done),以及用于启动该做业的命令。

11c11072e4a72af8ded6d87f3ff28b0e.png

能够经过命令行提示符同时启动任何数量的后台做业。每次启动一个新做业时,Linux系统将分配一个新做业编号和一个PID。使用ps命令能够查看运行的全部脚本。

启动的每一个后台进程都出如今ps命令的运行进程输出列表中。若是全部进程都在终端会中显示输出,那会变成一团糟。

注意ps命令的输出,每一个后台进程都链接着一个终端会话(pts/0)终端。若是终端会话退出,则后台进程将退出。若是与终端相关联的后台程序正在运行,有些终端模拟器会发出警告,而有些则不会。若是但愿在注销控制台后脚本继续之后太模式运行,则须要执行一些其余操做。

4. 非控制台下运行脚本

有时须要从终端启动shell脚本,而后让脚本结束以前之后台模式运行,即便退出终端会话也是如此。

nohup命令运行另外一个命令阻塞发送到进程的任何SIGHUP信号。这能够防止在退出终端会话时退出进程。

nohup命令格式:nohup test.sh &

nohupm命令将进程与终端断开,因此进程没有STDOUT和STDERR输出连接。为了接收命令生成的任何输出,nohup命令自动将STDOUT和STDERR消息冲向的到称为nohup.out的文件。nohup.out文件包含一般发送到终端监视器的全部输出。进程运行完成后,能够打开nohup.out文件查看输出结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值