iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >在脚本中如何使用Bash信号捕获
  • 922
分享到

在脚本中如何使用Bash信号捕获

2023-06-15 19:06:32 922人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚

这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚本会按照预期地正常结束,还是由于意外的错误导致失败。当脚本执行失败时,将正在处理的内容记录下来是非常有用的做法,但有时候这样做起来并不方便。而 Bash 中 trap 命令的存在正是为了解决这个问题,它可以捕获到脚本的终止信号,并以某种预设的方式作出应对。

响应失败

如果出现了一个错误,可能导致发生一连串错误。下面示例脚本中,首先在 /tmp 中创建一个临时目录,这样可以在临时目录中执行解包、文件处理等操作,然后再以另一种压缩格式进行打包:

#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir} ## create tmp dirmkdir "${TMP}" ## extract files to tmptar xf "${1}" --directory "${TMP}" ## move to tmpdir and run commandspushd "${TMP}"for IMG in *.jpg; do  mogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg ## move back to originpopd ## bundle with bzip2bzip2 --compress "${TMP}"/"${1%.*}".tar \      --stdout > "${1%.*}".tbz ## clean up/usr/bin/rm -r /tmp/tmpdir

一般情况下,这个脚本都可以按照预期执行。但如果归档文件中的文件是 PNG 文件而不是期望的 JPEG  文件,脚本就会在中途失败,这时候另一个问题就出现了:最后一步删除临时目录的操作没有被正常执行。如果你手动把临时目录删掉,倒是不会造成什么影响,但是如果没有手动把临时目录删掉,在下一次执行这个脚本的时候,它必须处理一个现有的临时目录,里面充满了不可预知的剩余文件。

其中一个解决方案是在脚本开头增加一个预防性删除逻辑用来处理这种情况。但这种做法显得有些暴力,而我们更应该从结构上解决这个问题。使用 trap 是一个优雅的方法。

使用 trap 捕获信号

我们可以通过 trap 捕捉程序运行时的信号。如果你使用过 kill 或者 killall 命令,那你就已经使用过名为 SIGTERM 的信号了。除此以外,还可以执行 trap -l 或 trap --list 命令列出其它更多的信号:

$ trap --list 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR111) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGio       30) SIGPWR31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) SIGRTMAX-1  64) SIGRTMAX

可以被 trap 识别的信号除了以上这些,还包括:

  • EXIT:进程退出时发出的信号

  • ERR:进程以非 0 状态码退出时发出的信号

  • DEBUG:表示调试模式的布尔值

如果要在 Bash 中实现信号捕获,只需要在 trap 后加上需要执行的命令,再加上需要捕获的信号列表就可以了。

例如,下面的这行语句可以捕获到在进程运行时用户按下 Ctrl + C 组合键发出的 SIGINT 信号:

trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT

因此,上文中脚本的缺陷可以通过使用 trap 捕获 SIGINTSIGTERM、进程错误退出、进程正常退出等信号,并正确处理临时目录的方式来修复:

#!/usr/bin/env bashCWD=`pwd`TMP=${TMP:-/tmp/tmpdir} trap \ "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \ SIGINT SIGTERM ERR EXIT ## create tmp dirmkdir "${TMP}"tar xf "${1}" --directory "${TMP}" ## move to tmp and run commandspushd "${TMP}"for IMG in *.jpg; do  mogrify -verbose -flip -flop "${IMG}"donetar --create --file "${1%.*}".tar *.jpg ## move back to originpopd ## zip tarbzip2 --compress $TMP/"${1%.*}".tar \      --stdout > "${1%.*}".tbz

对于更复杂的功能,还可以用 Bash 函数来简化 trap 语句。

关于“在脚本中如何使用Bash信号捕获”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 在脚本中如何使用Bash信号捕获

本文链接: https://www.lsjlt.com/news/281435.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在脚本中如何使用Bash信号捕获
    这篇文章将为大家详细讲解有关在脚本中如何使用Bash信号捕获,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Shell 脚本的启动并不难被检测到,但 Shell 脚本的终止检测却并不容易,因为我们无法确定脚...
    99+
    2023-06-15
  • shell脚本中如何进行信号的捕捉
    本篇文章给大家分享的是有关shell脚本中如何进行信号的捕捉,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。trap从字面意思看就是就是陷阱的意思但是在shell脚本中trap时...
    99+
    2023-06-28
  • Bash脚本:如何在Go中使用它?
    Bash脚本是一种非常常用的命令行工具,在Linux和Unix系统中被广泛使用。它可以帮助开发者自动化许多任务,从而提高生产力。但是,如果你正在使用Go语言,你可能会想知道如何在Go中使用Bash脚本。本文将介绍如何在Go中使用Bash脚...
    99+
    2023-06-24
    bash apache unix
  • 如何在Java中使用Bash脚本函数?
    Java是一种广泛使用的编程语言,而Bash脚本则是一种常用的命令行脚本语言。在某些情况下,我们需要在Java程序中使用Bash脚本函数来完成一些特定的任务。本文将介绍如何在Java中使用Bash脚本函数,并提供相关示例代码。 一、什么是B...
    99+
    2023-08-19
    函数 bash spring
  • “$” 符号如何在Shell 脚本中使用
    “$” 符号如何在Shell 脚本中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通常情况下,在工作中用的最多的有如下几项:$0:Shell 的命令本身1到9:表示 She...
    99+
    2023-06-09
  • Bash脚本中如何使用数组?
    Bash是一种流行的Shell编程语言,它常用于Linux和其他Unix系统中。Bash脚本是一种快速编写、自动化和调试命令行任务的方式。在Bash脚本中,数组是一种非常有用的数据结构,可以用来存储一组有序的数据。在本文中,我们将介绍如何...
    99+
    2023-10-29
    数组 bash windows
  • 如何使用bash脚本中if语句
    本篇内容主要讲解“如何使用bash脚本中if语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用bash脚本中if语句”吧!除了 "if,else" 形式之外,还有其它...
    99+
    2023-06-09
  • 如何在Java中使用Bash脚本处理Path对象?
    Path对象是Java中用于操作文件路径的类。它提供了一种简单的方式来处理文件和目录的路径,同时也允许开发人员轻松地编写跨平台的代码。但是,有时候我们需要处理一些复杂的文件操作,比如批量重命名、文件复制等,这时候使用Bash脚本可以更加方...
    99+
    2023-09-21
    path 对象 bash
  • 如何在 ASP 中使用 Bash 脚本实现高效存储?
    在ASP中使用Bash脚本实现高效存储是一项非常重要的技术,它可以大大提高网站的性能和可靠性。在本文中,我们将详细介绍如何使用Bash脚本来实现高效存储。 什么是Bash脚本? Bash是一种Unix shell,它是一种命令行解释器,也是...
    99+
    2023-11-07
    并发 bash 存储
  • 如何在Java中调用Bash脚本中的函数?
    Java和Bash都是广泛使用的编程语言,它们各有优势,Java在面向对象编程和跨平台方面非常强大,而Bash则在脚本编程和系统管理方面非常实用。在一些项目中,我们可能需要在Java代码中调用Bash脚本中的函数,这是一个比较常见的需求。本...
    99+
    2023-08-19
    函数 bash spring
  • Python3如何实现捕获Ctrl+C终止信号
    技术背景针对长时间运行的Python程序,例如服务器的后端或科学计算程序,需要特别关注。在进行某些操作时,如使用Ctrl+C结束正在运行的程序,我们可能需要提前中止。通常情况下,出现这种情况有两种可能性:一种是程序出错,需要停止程序以进行调...
    99+
    2023-05-21
    Python
  • Bash脚本中如何使用Spring框架函数?
    Bash是一种流行的Unix shell,用于编写脚本和执行命令。而Spring框架是一个用于构建企业级Java应用程序的框架。尽管Bash和Spring有着不同的用途,但是有时候在Bash脚本中使用Spring框架函数可以帮助我们更好地...
    99+
    2023-08-19
    函数 bash spring
  • Bash脚本中如何使用Apache的web服务?
    Apache是一款免费的、开源的Web服务器软件,它可以运行在多种操作系统上,包括Linux和Windows等。在Linux系统中,Apache是最流行的Web服务器软件之一。本文将介绍如何在Bash脚本中使用Apache的Web服务。 ...
    99+
    2023-10-03
    bash apache unix
  • 如何在 Python 容器中使用 Bash 脚本来记录日志?
    Python 是一种高级编程语言,它提供了许多功能,其中包括处理和操作数据的能力。Bash 脚本则是一种在 Linux 和 Unix 操作系统中使用的脚本语言,它可以用于自动化任务和处理系统日志等任务。在本文中,我们将介绍如何在 Pytho...
    99+
    2023-10-22
    容器 日志 bash
  • Java中如何使用Bash脚本处理Path对象?
    在Java中,Path类是一个非常有用的类,它可以用来表示文件或目录的路径。但是,在某些情况下,我们可能需要使用Bash脚本来处理Path对象。本文将介绍如何在Java中使用Bash脚本来处理Path对象。 获取Bash脚本路径 首先...
    99+
    2023-09-21
    path 对象 bash
  • 如何在Java中捕获异常
    今天就跟大家聊聊有关如何在Java中捕获异常,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2....
    99+
    2023-06-14
  • 如何在容器中使用 Git 管理 Python 项目的 Bash 脚本?
    在现代软件开发中,Git 已经成为了最流行的版本控制系统之一。同时,容器也成为了现代软件开发中不可或缺的一部分。在这篇文章中,我们将介绍如何在容器中使用 Git 管理 Python 项目的 Bash 脚本,以便更好地管理和维护我们的代码。...
    99+
    2023-10-13
    git 容器 bash
  • 如何在Go语言中使用Bash脚本处理数组索引?
    在Go语言中,处理数组是一个常见的任务。使用Bash脚本处理数组索引是一种有效的方法。本文将介绍如何在Go语言中使用Bash脚本处理数组索引,并提供一些示例代码。 首先,我们需要了解一些Bash脚本的基础知识。在Bash脚本中,可以使用$...
    99+
    2023-06-21
    bash 索引 数组
  • 你知道如何在Python中使用bash脚本操作数组吗?
    在Python中,使用bash脚本操作数组是一种非常常见的方式,特别是在需要处理大量数据时。在本文中,我们将介绍如何在Python中使用bash脚本操作数组,并提供一些实用的示例代码。 首先,我们需要了解一下bash脚本和数组的基础知识。b...
    99+
    2023-10-07
    bash 数组 path
  • Bash脚本中如何调用Java函数?
    Bash脚本是一种常用的命令行脚本语言,而Java是一种面向对象的编程语言。在实际的开发过程中,我们可能会遇到需要在Bash脚本中调用Java函数的情况。本文将介绍如何在Bash脚本中调用Java函数。 环境准备 在开始之前,我们需要...
    99+
    2023-08-19
    函数 bash spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作