首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么“陷阱退出”不能在Bash的后台作业中工作?

“陷阱退出”在Bash的后台作业中无法工作的原因是,后台作业是在子shell中运行的,而陷阱(trap)是在当前shell中设置的。当一个命令被放到后台执行时,它会在一个新的子shell中运行,而不是当前shell中。因此,陷阱设置不会被继承到子shell中,导致无法捕获和处理陷阱事件。

陷阱是一种在Shell脚本中用于捕获和处理信号的机制。通过设置陷阱,可以在脚本执行过程中捕获特定的信号,并执行相应的操作,如清理临时文件、关闭打开的文件等。然而,在后台作业中,由于子shell的独立性,无法直接使用陷阱来处理信号。

要解决这个问题,可以使用其他机制来处理后台作业中的信号。一种常见的方法是使用nohup命令将作业放到后台执行,并将输出重定向到文件中。例如,可以使用以下命令将脚本作为后台作业运行:

代码语言:txt
复制
nohup ./script.sh > output.log 2>&1 &

这样,作业将在后台运行,并将输出重定向到output.log文件中。在这种情况下,可以使用其他方式来处理信号,如编写一个单独的监控脚本来检测后台作业的状态,并在需要时执行相应的操作。

腾讯云提供了一系列与云计算相关的产品和服务,包括云服务器、云数据库、云存储等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多关于腾讯云的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么从乙方出来技术人,能在工作 ‘更猛,更持久’?

即便你个人影响力达到极高程度,或许也无法在与 “独角兽” 争夺人才战斗讨得便宜。 该采取什么样应对措施呢? “拥抱现实,应对现实” ,这是《原则》让我记忆较为深刻一句话。...简单来说,与你签合同公司并不是你要服务对象,而是以长期外派形式被派到另一个公司工作,接受服务公司叫 “甲方”,而与你签订合同公司叫 “乙方”。...签完合同后,基本上你和你签合同单位是没有任何交集,他们只负责每个月给你发工资。 为什么 “更猛,更持久” ? 不可否认,有许多企业排斥从 “乙方公司” 出来小伙伴,甚至根本不看类似的简历。...只有你自己公司才能给你归属感。 可是你却永远不在自己公司工作,又怎么可能有归属感呢?...这时候,也许你就要再重新考虑住处和交通了,因此换工作可能性会非常大。

46820

Bash编程 set -e 与 trap exit ERR 有什么相同点和不同点

相同点 目的:两者都是为了提高脚本健壮性,旨在及时发现并响应错误情况,避免因某一部分失败而导致整个脚本继续执行潜在错误逻辑。 错误处理:它们都能在命令执行失败(即返回非零退出状态)时采取行动。...资源清理: trap命令特别适合用于定义EXIT陷阱,以确保无论脚本如何退出(无论是正常结束还是因错误退出),都可以执行必要清理操作,比如释放资源或恢复环境状态。...而set -e直接提供这种资源管理功能。 兼容性: set -e:几乎所有的 Bash 版本都支持。...trap 'exit ERR' ERR:同样广泛支持,但可能在某些非常旧 shell 不可用。...需要注意是:在“进程替换”(process substitution)执行 exit 命令或因错误触发陷阱,并不会终止外部进程,只会结束那个特定子进程。

16510
  • linux 后台运行进程:& , nohup

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要事情要做,比如阅读电子邮件。对于密集访问磁盘进程,我们更希望它能够在每天非负荷高峰时间段运行(例如凌晨)。...后台执行 比较下 & 与 nohup: & :后台运行,但用户终端退出时(断连),命令结束 nohup test.sh & : 后台运行,用户终端退出时(断连)依然保持运行,可使用标准输入输出 & 当在前台运行某个作业时...在后台运行作业时要当心:需要用户交互命令不要放在后台执行,因为这样你机器就会在那里傻等。不过,作业后台运行一样会将结果输出到屏幕上,干扰你工作。...如果放在后台运行作业会产生大量输出,最好使用下面的方法把它输出重定向到某个文件: command > out.file 2>&1 & 这样,所有的标准输出和错误输出都将被重定向到一个叫做out.file...(ps -ef | grep 进程号 或者 kill -9 进程号) nohup 使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。

    4.5K40

    从进程组、会话、终端概念深入理解守护进程

    与普通进程相比它大概有如下特点: 无需控制终端(不需要与用户交互) 在后台运行 生命周期比较长,一般是随系统启动和关闭 守护进程必要性 为什么要设置为守护进程,普通进程不可以吗?...3、会话(session) 多个进程组构成一个「会话」,建立会话进程是会话领导进程,该进程 ID 为会话 SID。会话每个进程组称为一个「作业」。...会话意义在于能将多个作业通过一个终端控制,一个前台操作,其它后台运行。...4、前后台作业相关操作 让作业由进入后台运行: $ ping localhost >/dev/null & [1] 10269 # 终端显示 # [1]:作业ID 10269:进程组ID 给后台作业发信号...为了避免这个问题,可以调用chdir()函数将工作目录设置为根目录/。 5、设置文件权限掩码 文件权限掩码是指屏蔽掉文件权限对应位。

    1.1K20

    java检测tomcat宕机_Tomcat意外宕机分析

    交互模式与非交互模式对作业控制(job control)默认方式不同: I)在交互模式下,因为作业控制需要,shell不会对后台进程处理SIGINT信号设置为忽略。...因此这样的话,父进程会把收到键盘事件比如ctrl-c之类SIGINT传播给进程组每个成员(假设后台进程也是父进程组成员),那么终端随意ctrl-c就可能导致所有的后台进程退出,显然这样是不合理...不开启作业控制的话,脚本里后台进程可以通过设置忽略SIGINT信号来避免父进程对组成员传播,因为对它来说这个信号已经没有意义。...因为java后台进程从父进程catalina.sh(又是从其父进程test.sh)继承pgid,所以java进程仍属于test.sh进程组里成员,收到SIGHUP后退出。...注: 如果把tail 打印这一行去掉,为什么Java进程也不会退出,我猜原因应该是,如果没有tail的话, Java进程就不是他们子进程了,自然怎么操作都不会受影响。

    1.4K10

    《Linux命令行与shell脚本编程大全》第十六章 控制脚本

    但是这样可以在终止进程情况下能深入脚本内部一窥究竟。 Ctrl+z 会生成一个SIGTSTP信号,停止shell运行任何进程。...16.1.3 捕获信号 也可以忽略信号,在信号出现时捕获它们并执行相应命令。 trap命令允许你来指定脚本要监看并从shell拦截linux信号。...在终端会话中使用后台进程要注意,ps命令输出,每一个后台进程都和终端会话(pts/0)终端联系在一起。如果终端会话退出,那么后台进程也会退出。...那么值钱带减号就变成默认作业了。 16.4.2 重启停止作业 可以将已停止作业作为后台进程或前台进程(会接管你当前工作终端)重启。 用bg命令实现。 bg 加上作业号。...如果没有关联电子邮件就无法获得输出,所以最好在脚本对STDERR和STDOUT进行重定向 at-M选项用来屏蔽作业产生输出信息。 例子:就是重定向例子。这里写了。 3.

    3K61

    Linux - 请允许我静静地后台运行

    作业 作业概念与进程组类似,同样由一个或多个进程组成,它分为前台作业后台作业,一个会话会有一个前台作业和多个后台作业,与进程组不同是,作业某个进程产生子进程并不属于这个作业。...& 首先是我们最经常遇到符号 &,将它附在命令后面可以使进程在后台执行,不会占用前台界面。它实际上是在会话开启了一个后台作业,对作业操作我们后面再说。...使用它,我们可以暂停正在占用终端进程而不停止它,从而让我们使用终端命令来操作此进程。 bg bg是 backgroud 缩写,顾名思义,bg %id 把作业放到后台进程执行。...(特别是子进程退出处理); 可选项: 使用 chdir 改变进程工作目录,一般到根目录下,防止占用可卸载文件系统; 用 umask 重设文件权限掩码,不再继承父进程文件权限设置; 关闭父进程打开文件描述符...参考: setsid为什么会在脚本阻塞-StackoOerflow Linux 进程、进程组、会话周期、控制终端

    1.7K50

    Tomcat进程意外退出,元凶居然是他...

    确定了是由signal引起之后,我疑惑变成了: 1) 为什么SIGINT (kill -2) 不会让tomcat进程退出?...交互模式与非交互模式对作业控制(job control)默认方式不同 为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?...因为默认如果采用父进程进程组ID,父进程会把收到键盘事件比如ctrl-c之类SIGINT传播给进程组每个成员,假设后台进程也是父进程组成员,因为作业控制需要不能忽略SIGINT,你在终端随意...不开启作业控制的话,脚本里后台进程可以通过设置忽略SIGINT信号来避免父进程对组成员传播,因为对它来说这个信号已经没有意义。...如果我们在test.sh里设置开启作业控制的话,就不会让java进程退出了 #!/bin/bash set -m cd /home/admin/tt/tomcat/bin/ .

    4K10

    Tomcat 进程意外突崩,元凶居然是它...

    确定了是由signal引起之后,我疑惑变成了: 1) 为什么SIGINT (kill -2) 不会让tomcat进程退出?...交互模式与非交互模式对作业控制(job control)默认方式不同 为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?...因为默认如果采用父进程进程组ID,父进程会把收到键盘事件比如ctrl-c之类SIGINT传播给进程组每个成员,假设后台进程也是父进程组成员,因为作业控制需要不能忽略SIGINT,你在终端随意...不开启作业控制的话,脚本里后台进程可以通过设置忽略SIGINT信号来避免父进程对组成员传播,因为对它来说这个信号已经没有意义。...如果我们在test.sh里设置开启作业控制的话,就不会让java进程退出了 #!/bin/bash set -m cd /home/admin/tt/tomcat/bin/ .

    1.1K10

    管道符、shell变量、环境变量配置文件 原

    8.6 管道符和作业控制 管道符“|” 管道符作用在于将符号前面的结果丢给符号后面的命令。...作业控制 Ctrl+z 暂停一个正在执行任务 jobs 查看在后台运行任务 bg[id] =background把任务调到后台运行 fg[id] =foreground把任务调到前台运行 “&” 命令后面加...语法: export [变量名] 当export指定变量时,它会声明系统所有变量。...shell,这个shell是原来shell子shell,可以使用pstree命令把系统中所有进程以树状图结构打印出来,pstree所在行显示即为当前所在shell(exit可以退出子shell)。...~/.bash_history ~/.bash_logout 在此可以设定退出登录时系统执行操作(如清除缓存、清除历史记录等等) 变量“PS1” 该变量用于定义“[root@adai002 ~]#

    77720

    【linux命令讲解大全】088.深入理解 shell 脚本 trap 命令

    在有些情况下,我们希望自己 shell 脚本在运行时刻被中断,比如说我们写得 shell 脚本设为某一用户默认 shell,使这一用户进入系统后只能作某一项工作,如数据库备份,我们可不希望用户使用...Ctrl+C 等方法进入到 shell 状态做我们希望做事情。...以下是一些你可能会遇到常见信号: 信号名称 信号数 描述 SIGHUP 1 本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端控制进程结束时,通知同一 session 内各个作业,这时它们与控制终端不再关联...在这个终端运行所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出 Linux 登录时,前台进程组和后台有对终端输出进程将会收到 SIGHUP 信号。...忽略信号 如果陷阱列出命令是空,指定信号接收时,将被忽略: trap '' 2 忽略多个信号: trap '' 1 2 3 15 重置陷阱 当你改变了收到信号后采取动作,你可以省略第一个参数来重置到默认行为

    19310

    Linux之进程管理(3)作业管理

    对运行进程:使用Ctrl+z 2、尚未启动作业:COMMAND &  (在命令行最后面加一个&符号) 后台作业与终端关系处理: 后台作业虽然被送往后台允许,但其依然与终端相关;退出终端,将关闭后台作业...,这样即断电,下次还恢复到screen的当前状态 查看所有后台作业命令: jobs 命令 jobs命令例子: #将/etc/下所有shell脚步文件路径保存到临时文件,并放入后台执行 [root@localhost.../tempfile.log & 解析:这里显示 Runing表示正在执行,因为文件太多所以执行速度不如上面快,执行结束后,如果不再查看jobs,进程会自动清除,并退出当前作业列表。...解析:这里因为把标准输出转向一个文件,所以不会印象当前进程工作。...[root@mageedu ~]# kill -15 %1 提示:后面的作业号必须要加上%,表示为jobs列表作业号,否则就当作进程PID了。

    1.2K20

    Linux退出命令为初学者解释(附例)

    在本教程,我们将讨论一个这样较少使用命令: Exit 。 请注意,本文中提到所有示例和说明都已在Ubuntu 16.04LTS上运行Bash shell上进行了测试。...现在,有些人可能会问为什么(或者说是什么时候)N是必需。 那么,基本上是退出状态值 - 主要是在脚本(bash脚本)中使用命令时使用。 在某些情况下,此值映射到人为可读错误,警告或通知。...现在,在父shell(我返回地方),我使用以下命令检查退出状态: echo $? 所以你可以看到它是传递给root shellexit命令状态值。...现在,这里是另一个例子,在这里我没有显式地从root shell传递任何退出状态,但是在父shell查询时,返回了在根shell运行最后一个命令退出状态: 定义陷阱 如果需要,您还可以定义一些您希望系统在...这就是实际发生事情 - 见下文: 所以这样,你可以在退出时设置陷阱

    1.7K20

    Shell脚本——内置命令

    一、内置命令 所谓 Shell 内置命令,就是由 Bash 自身提供命令,而不是文件系统某个可执行文件。...可以接收这个退出状态; exit 命令可以接受一个整数值作为参数,代表退出状态。如果指定,默认状态值是 0。 一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。...读取并执行指定文件命令(在当前 shell 环境) alias 为指定命令定义一个别名 bg 将作业后台模式运行 bind 将键盘序列绑定到一个 readline 函数或宏 break 退出 for...dirs 显示当前存储目录列表 disown 从进程作业刪除指定作业 echo 将指定字符串输出到 STDOUT enable 启用或禁用指定内建shell命令 eval 将指定参数拼接成一个命令...并将其加入索引数组 popd 从目录栈删除记录 printf 使用格式化字符串显示文本 pushd 向目录栈添加一个目录 pwd 显示当前工作目录路径名 read 从 STDIN 读取一行数据并将其赋给一个变量

    2.1K10

    linux后台执行命令&和nohup具体使用方法

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要事情要做,比如阅读电子邮件。对于密集访问磁盘进程,我们更希望它能够在每天非负荷高峰时间段运行(例如凌晨)。...在后台运行作业时要当心:需要用户交互命令不要放在后台执行,因为这样你机器就会在那里傻等。不过,作业后台运行一样会将结果输出到屏幕上,干扰你工作。...如果放在后台运行作业会产生大量输出,最好使用下面的方法把它输出重定向到某个文件: command > out.file 2>&1 & 这样,所有的标准输出和错误输出都将被重定向到一个叫做out.file...(ps -ef | grep 进程号 或者 kill -9 进程号) nohup 使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行...command > myout.file 2>&1 & 使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束时候,命令还是自己结束了。

    2.7K31

    什么是守护进程?

    shell分前后台作业来控制不是进程而是作业。一个作业由多个进程组成。Shell可以运行一个前台作业和任意多个后台作业,称为作业控制。bash就是一个独立作业。...当然,进程组和作业也并不是完全等价两个概念:如果作业某个进程有创建了新子进程,该子进程不属于作业,但属于该进程组。 会话(Session)是一个或多个进程组集合。一个会话可以有一个控制终端。...一个会话,有一个前台作业和若干个后台作业。会话SID是会话手进程PID。 为什么只能运行一个前台作业?...当我们在前台新起了一个作业,shell就被提到了后台,因此shell就没有办法再继续接受我们指令并且解析运行了。...但是如果前台进程退出了,shell就会有被提到前台来,就可以继续接受我们命令并且解析运行。 那么,如何来切断进程和终端关系呢? 首先,调用 setsid() 使子进程成为新会话组长。

    1.1K20

    想让进程后台运行,试试Linuxnohup命令,3分钟学会。

    常见用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。 将程序放到后台运行,一般有两种方式: (1)command &:后台运行,关掉终端会停止运行。...注意: (1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录 nohup.out 文件。...如果当前工作目录 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件。如果没有文件能创建或打开用于追加,那么 command 参数指定命令不可调用。...命令提交作业,那么在缺省情况下该作业所有输出都被重定向到一个名为nohup.out文件,除非另外指定了输出文件。.../test.sh > test.log 2>&1 & (3)指定输出文件, 输出被重定向到output.txt文件 [deng@itcast ~]$ nohup bash a.sh &> error.txt

    5.4K50

    Linux 让进程在后台可靠运行几种方法

    当我们将”&”也放入“()”内之后,我们就会发现所提交作业并不在作业列表,也就是说,是无法通过jobs来查看。让我们来看看为什么这样就能躲过 HUP 信号影响吧。...灵活运用 CTRL-z 在我们日常工作,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作, 然后再用 fg 来将挂起进程重新放回前台(也可用 bg 来将挂起进程放在后台...需要注意是,当使用过 disown 之后,会将把目标作业作业列表移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。...但是还有一个问题,这种方法操作对象是作业,如果我们在运行命令时在结尾加了”&”来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业列表。...CTRL-z 用途就是将当前进程挂起Suspend,然后我们就可以用jobs命令来查询它作业号,再用bg jobspec来将它放入后台并继续运行。

    99120

    &和nohup

    一.简介 当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要事情要做,比如阅读电子邮件。...例如: sh test.sh & 在后台运行作业时要当心:需要用户交互命令不要放在后台执行,因为这样你机器就会在那里傻等。 不过,作业后台运行一样会将结果输出到屏幕上,干扰你工作。...如果放在后台运行作业会产生大量输出,最好使用下面的方法把它输出重定向到某个文件: sh test.sh &>> out.file & 这样,所有的信息都将被重定向到一个叫做out.file 文件...使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会在后台当做一个进程使用。...’ 可以: nohup sh test.sh &>> out.file & 将不会出现提示,并输出到其中 使用了nohup之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束时候,命令还是自己结束了

    72530
    领券