在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
信号和 Traps信号是发送给程序的软件中断,表明已发生的重要事件。这些事件的范围可以是从用户请求到非法内存访问错误。这些信号,如中断信号,表明用户要求程序做一些非一般流程控制下的事情。 以下是一些你可能会遇到的并且需要在程序中使用的常见信号:
信号列表有一个简单的方法可以列出你的系统所支持的所有信号。仅仅用命令 kill -l 就可以显示系统所有支持的信号:
Solaris, HP-UX 和 Linux 之间实际的信号列表会有所不同。 默认动作每一个信号都有一个与之相随的默认动作。一个信号的默认动作是当脚本或程序接收到一个信号时,它的执行表现。 这些可能的默认动作是:
发送信号有几种向程序或者脚本传递信号的方法。其中用户最常见的是在正在运行的脚本的时候,按下 Ctrl+C 或者 INTERRUPT 键。 当你按下 Ctrl+C 键,信号 SIGINT 被发送到脚本中,根据之前定义的默认动作,脚本将会被终止。 另外一种常见的传送信号的方法是使用 kill 命令,其语法如下所示:
这里的 signal 要么是信号值,要么是信号名称。 pid 是信号要发送到的进程的 ID。 例如:
发送 HUP 信号(即意外终止信号)到运行进程 ID 为 1001 的程序。 用下面的命令来发送一个 kill 信号到同样的进程:
这条命令会杀死运行进程 ID 为 1001 的程序。 捕获信号当一个 Shell 程序正在执行的过程中,你在终端按下了 Ctrl+C 或 Break 键,通常情况下,程序会立即终止,并且你的命令提示返回。但这可能并不总是你所期望的。例如,这可能会留下一堆未清理的临时文件。 捕获这些信号是很容易的,捕获命令(trap)的语法如下:
这里的 commands 可以是任何有效的 UNIX 命令,甚至可以是一个用户定义的函数。 signals 可以是一个你想捕获的任何数量信号的列表。 在 Shell 脚本中,trap 有三种常见的用途:
清除临时文件作为 trap 命令的一个例子,下面的命令展示了,如果有人试图从终端中止程序时,你如何先删除一些文件,然后退出:
如果程序收到了信号值为 2 的信号,trap 命令将会被执行。从 Shell 程序上执行 trap 的这一点开始,work1$$ 和 dataout$$ 这两个文件会自动被删除。 所以如果用户中断程序的运行,这个 trap 将会被执行,你可以确保这两个文件将被清理掉。rm 后面的这个 exit 命令,它的存在是必要的。如果没有它,程序会在它中断点(也就是信号接收的时刻)继续执行。 信号值 1 是由挂断产生的:要么是有人故意挂断终端或者是终端被意外断开。 在这种情况下,把信号值 1 增加到信号列表中,你可以通过这样修改上面的 trap 命令,从而删除那两个指定的文件:
现在,如果终端被挂起或者是 Ctrl+C 被按下,这些文件将被删除。 指定的 trap 命令如果包含多个命令,那么它们必须括在引号中。还要注意,当 trap 命令执行时,shell 会扫描一遍命令行,当接收到信号列表的其中一个信号时,也会再执行一次扫描。 所以在上面的例子中,当 trap 命令执行后,WORKDIR 和 $$ 的值将会被替换。如果你想要这种替换仅仅发生在信号值 1 或者 2 接收到的时候,你可以用单引号把多个命令引起来:
忽略信号如果 trap 命令的 command 字段是空的,那么当接收到指定的信号后,信号将被忽略。例如下面的一个命令:
指定的中断信号将被忽略。当执行某些可能不想被打断的操作时,你可能会想忽略掉些特定的信号。按如下所示,你可以指定要忽略的多个信号:
注意,如果要一个信号被忽略掉,那么第一个参数必须是指定的空,它不等同于如下的命令,下面的命令有自己单独的意义:
如果你忽略了一个信号,那么你所有的子 Shell 也会忽略此信号。然而,如果你指定了接收一个信号所采取的动作,那么所有的子 shell 接收到此信号后会采取相同动作。 重置 Traps当你改变了信号接收后的默认动作,你可以通过一个简单的省略第一个参数的 trap 命令将默认动作重置回来。 那么命令
将信号 1 和 2 接收后采取的动作重置为其原有的默认动作。 |
请发表评论