Shell编程—控制脚本
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编程—控制脚本的更多相关文章
- Shell编程(脚本)的经常使用命令和语句
一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...
- Shell编程-12-Shell脚本规范及调试
目录 Shell脚本规范 Shell脚本调试 Shell脚本规范 良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...
- Shell编程-01-Shell脚本初步入门
目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell 简单来说Shell其实就是一个命令 ...
- Shell编程—基础脚本
1. 使用多个命令 如果要两个命令或者多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开. 2. 创建 shell 脚本文件 例如: #!/bin/bash # This script dis ...
- shell编程之脚本参数$@,$*,$#,$$,$?的含义
#首先按顺序解释各个参数的含义 1.$0 表示脚本的文件名, 具体的路径信息和执行命令时的相对位置有关,例如 sakura@mi-OptiPlex-7050:~/sh$ sh args.sh arg ...
- [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 ...
- shell编程第一天
shell编程基础 脚本:简单来说就是一条条的文字命令(一些指令的堆积)Shell属于内置的脚本 1.程序开发效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 2.语法简单,代码写起来 ...
- Linux命令行和shell编程
Shell Shell是一个程序,用户输入的命令通过shell来传达给内核或其它程序.用户在linux打开一个终端,终端就会自动调用用户的shell. Linux上的Shell有很多种,用的最多是sh ...
- 《Linux命令行与shell脚本编程大全》第十六章 控制脚本
一些控制脚本的方式:向脚本发送信号.修改脚本优先级,在脚本运行时切换到运行模式 16.1 处理信号 linux利用信号与运行在系统中的进程进行通信. 也可以通过对脚本进行编程,使其在收到特定信号时执行 ...
随机推荐
- MacOS安装npm
原文链接:https://www.cnblogs.com/zmdComeOn/p/11543441.html 第一步:检查brew -v是否安装了homebrew这个MacOS 缺失的软件包的管理器. ...
- 9-Pandas之数据合并与轴向连接(pd.concat()的详解)
数据合并:由于数据可能是不同的格式,且来自不同的数据源,为了方便之后的处理与加工,需要将不同的数据转换成一个DataFrame. Numpy中的concatenate().vstack().hstac ...
- PHP array_reduce() 函数
实例 发送数组中的值到用户自定义函数,并返回一个字符串: <?phpfunction myfunction($v1,$v2){return $v1 . "-" . $v2;} ...
- PHP preg_grep() 函数
preg_grep 函数用于返回匹配模式的数组条目.高佣联盟 www.cgewang.com 语法 array preg_grep ( string $pattern , array $input [ ...
- Docker这些none:none的镜像,难道就不配拥有名字吗
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 搞容器开发一段时间后,想看看都有哪些镜像,执行了一下docker images -a,蒙圈了,有一堆<none> ...
- 使用MPI进行分布式内存编程(2)
MPI的英文全称为message passing interface,中文名为消息传递接口,他不是一种新的语言,而是一个可以被C,C++,Fortran程序调用的库. 预备知识 1.编译与执行 使用类 ...
- 一个简单的CPP处理框架
好久没有在csdn上写过东西了,这么多年,一方面是工作忙,下班到家也没有开过电脑了,要陪小孩玩: 下面分享一段代码,是用CPP做的一个简单的消息(协议)处理框架: 是通过成员函数指针+map来实现的: ...
- Docker-compose实战
Docker-compose实战 各位小伙伴们,我们前面的篇文章分享了.docker的基础知识点.如何编写一个Dockerfile.docker网络是怎么回事.如何编写docker-compose.y ...
- Java实现短信验证码
前言 本人使用的是阿里短信服务,一开始尝试了许多不同的第三方短信服务平台,比如秒滴科技.梦网云通讯.当初开始为什么会选择这两个,首先因为,他们注册就送10元钱(#^.^#),但是后来却发现他们都需要认 ...
- 8道python练习题,能做出来的没几个
变量的定义 程序就是用来处理数据的,而变量就是用来存储数据的 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道 ...