Linux使用信号与系统上运行的进程进行通讯。
可使用这些信号控制Shell脚本的运行,只须要让shell脚本在接收到来自Linux系统的特定信号时执行命令便可。shell
编号编程 |
信号名称安全 |
缺省操做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 |
否 |
Bashshell可使用键盘上的组合键生成两个基本的Linux信号。若是须要中止或暂停失控的程序,那么这个功能会被用上。
2.1 中断进程
使用Ctrl+C组合键能够生成SIGINT信号,并将其发送给当前正在shell中运行的任意进程。运行一个一般须要很长时间才能完成的命令并按Ctrl+C组合键,能够测试此操做。
Ctrl+C组合键不会在监视器上生成任何输出,它只会中止当前在shell中运行的进程。sleep命令在指定的秒数以内暂停操做。
一般,命令提示符在计时器过时以前不会返回。在计时器过时以前按Ctrl+C组合键,可使sleep命令提早终止。
2.2 暂停进程
Ctrl+Z组合键生成SIGSTP信号,能够中止任何在shell中运行的进程。中止进程与终止进程不一样,中止进程后程序任然留在内存中,可以从中止的地方继续运行。
方括号中的数字是shell分配的做业编号(jobnumber)。
shell以做业(job)形式引用shell中运行的每一个进程,向每一个做业分配惟一的做业编号。
它向第一个启动的进程分配做业编号1,向第二进程分配做业编号2,以此类推。
若是shell会话中有一个中止的做业,在退出shell时bash将发出警告。使用ps命令查看中止的做业:
在S列(进程状态),ps命令将已中止做业的状态显示为T
若是想在中止做业仍处于活动状态时退出shell,只须要再次键入exit命令。shell将退出,并终止亭子的做业。还有一种方法是知道中止做业的PID,使用kill命令发送SIGKILL信号来终止它。
2.3 捕获信号
除了可使脚本忽略信号以外,还能够在信号出现时捕获信号和执行其余命令。
trap命令能够指定可以经过shell脚本监控和拦截的Linux信号。若是脚本收到trap命令中列出的信号,它将保护该信号不被shell处理,并在本地处理它。
trap命令格式:trap commands signals。在trap命令行中,只须要列出但愿shell执行的命令,以及但愿捕获的信号列表(以空格分隔)。指定信号能够经过它们的数值或Linux信号名实现。
当每次检测到SIGINT和SIGTERM信号时显示一个简单的文本消息。若是捕获到这些信号,在用户试图使用bash shell键盘Ctrl+C命令中止程序时,脚本将不受影响。每次使用Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,而不是忽略信号并容许shell中止脚本。
2.4 捕获脚本退出
除了在shell脚本中捕获信号以外,能够在shell脚本退出时捕获它们。这是一种在shell完成做业时执行命令的便捷方式。要捕获shell脚本退出,只须要向trap命令添加EXIT信号。
当脚本到达常规退出点时,就会触发trap,shell将执行在trap命令行中指定的命令。
若是提早退出脚本,也可以捕获EXIT。使用Ctrl+C组合键发送SIGINT信号时,脚本退出,可是在脚本退出以前,shell将执行trap命令。
2.5 移除捕获
要移除捕获,使用破折号做为命令和想要恢复正常行为的信号列表。
信号捕获移除后,脚本将忽略信号。可是,若是在移除捕获以前收到信号,脚本仍将根据trap命令处理该信号。
使用ps命令,能够查看Linux系统上运行的进程。全部进程不在终端监视器上运行。这就是所谓的后台运行进程。在后台模式中,进程运行时与终端会话STDIN、STDOUT和STDERR无关。
经过命令行界面之后台模式运行shell界面,只须要在命令后加上一个&符号。
将&符号放在命令以后时,它将bashshell与命令相分离,并以独立的后台进程形式在系统上运行。
显示的一行相似:[1] 19555,方括号的数字是shell分配给后台的做业编号。后面的数字是LInux系统分配给进程的PID。全部Linux系统上运行的进程都必须有惟一的PID。
系统显示这些条目以后,将出现一个新的命令行界面提示符。执行的命令将之后模式安全运行。
这是,能够在提示符处输出新的命令,可是后台进程仍在运行,任然使用终端监视器显示STDOUT和STDERR消息。
后台进程结束时,在终端显示消息格式:[1]+ Done ./test 这表示做业编号和做业状态(Done),以及用于启动该做业的命令。
能够经过命令行提示符同时启动任何数量的后台做业。每次启动一个新做业时,Linux系统将分配一个新做业编号和一个PID。使用ps命令能够查看运行的全部脚本。
启动的每一个后台进程都出如今ps命令的运行进程输出列表中。若是全部进程都在终端会中显示输出,那会变成一团糟。
注意ps命令的输出,每一个后台进程都链接着一个终端会话(pts/0)终端。若是终端会话退出,则后台进程将退出。若是与终端相关联的后台程序正在运行,有些终端模拟器会发出警告,而有些则不会。若是但愿在注销控制台后脚本继续之后太模式运行,则须要执行一些其余操做。
有时须要从终端启动shell脚本,而后让脚本结束以前之后台模式运行,即便退出终端会话也是如此。
nohup命令运行另外一个命令阻塞发送到进程的任何SIGHUP信号。这能够防止在退出终端会话时退出进程。nohup命令格式:nohup test.sh &nohupm命令将进程与终端断开,因此进程没有STDOUT和STDERR输出连接。为了接收命令生成的任何输出,nohup命令自动将STDOUT和STDERR消息冲向的到称为nohup.out的文件。nohup.out文件包含一般发送到终端监视器的全部输出。进程运行完成后,能够打开nohup.out文件查看输出结果。