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

当我的shell脚本退出时,如何终止后台进程/作业?

当你的 shell 脚本退出时,你可以使用 trap 命令来注册一个信号处理器,以便在脚本退出时终止后台进程/作业。

以下是一个示例脚本,它演示了如何使用 trap 命令来实现这一目标:

代码语言:bash
复制
#!/bin/bash

# 定义一个函数,用于在脚本退出时终止后台进程/作业
cleanup() {
  # 获取所有后台进程的 PID
  local pids=$(jobs -p)

  # 遍历所有后台进程,并终止它们
  for pid in $pids; do
    kill $pid
  done
}

# 注册 cleanup 函数,以便在脚本退出时执行
trap cleanup EXIT

# 启动一些后台进程/作业
sleep 10 &
sleep 20 &

# 脚本退出时,cleanup 函数将自动执行,终止所有后台进程/作业

在这个示例中,我们定义了一个名为 cleanup 的函数,该函数用于终止所有后台进程/作业。然后,我们使用 trap 命令将 cleanup 函数注册为脚本退出时的信号处理器。最后,我们启动了两个后台进程/作业,并在脚本退出时自动终止它们。

请注意,这个示例仅适用于在脚本中启动的后台进程/作业。如果你需要终止其他类型的后台进程/作业,你可能需要使用其他方法。

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

相关·内容

Linux中作业控制命令

Linux作业 作业(Job)是shell管理进程(每个job都有一个关联PID),每个作业会被分配一个线性job ID。...nohup:关闭终端也执行 “很多时候,你是通过ssh登录到远程服务器,再执行Shell脚本或命令,如果你退出了终端(终止远程连接),则该进程/命令将被杀死。...如果不确定该作业何时完成,则最好让该作业后台运行,但是,如果你退出系统,该作业将被Shell停止并终止,当进程收到SIGHUP如何使作业后台运行?...这个时候,我们就要使用nohup命令,让我们长时间运行Shell脚本或命令在我们退出系统依旧能执行(此时一般搭配&后台执行)。 “顾名思义:nohup是用于忽略HUP(挂断)信号POSIX命令。...总结: 只能在初始化作业shell里管控作业 fg %n bg %n 切换前后台作业 nohup & 搭配,帮助长时间后台运行作业,在你退出系统,依旧可运行

2.4K30

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

停止进程  9    SIGKILL    无条件终止进程 15    SIGTERM   尽可能终止进程 …… 默认情况下,bash shell会忽略收到任何SIGOUT(3)和SIGTERM(15...有时打开了一个关键系统文件锁,这就比较危险了。 但是这样可以在不终止进程情况下能深入脚本内部一窥究竟。 Ctrl+z 会生成一个SIGTSTP信号,停止shell中运行任何进程。...16.2.1 后台运行脚本 命令后面加个取地址符就好了 例如: $./test & 显示第一行是shell分配给后台进程作业号[]里面的。后面那个是进程PID。...在终端会话中使用后台进程要注意,ps命令输出中,每一个后台进程都和终端会话(pts/0)终端联系在一起。如果终端会话退出,那么后台进程也会退出。...这样终端退出脚本也不会退出。 命令格式: $nohup ./test & nohup会自动将STDOUT和STDERR消息重定向到一个名为nohup.out文件中。

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

    当我们在终端或控制台工作,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要事情要做,比如阅读电子邮件。对于密集访问磁盘进程,我们更希望它能够在每天非负荷高峰时间段运行(例如凌晨)。...后台执行 比较下 & 与 nohup: & :后台运行,但用户终端退出(断连),命令结束 nohup test.sh & : 后台运行,用户终端退出(断连)依然保持运行,可使用标准输入输出 & 当在前台运行某个作业...在后台运行作业要当心:需要用户交互命令不要放在后台执行,因为这样你机器就会在那里傻等。不过,作业后台运行一样会将结果输出到屏幕上,干扰你工作。...(ps -ef | grep 进程号 或者 kill -9 进程号) nohup 使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户),作业就会停止运行。...如果会话期首进程终止,则该信号发送到该会话期前台进程组。 一个进程退出导致一个孤儿进程组中产生,如果任意一个孤儿进程进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程

    4.5K40

    Linux小课堂之Wait命令

    wait是一个shell命令,它等待给定进程完成,然后返回其退出状态。 Wait命令用于等待特定进程ID和作业ID并返回其终止状态。...在执行大型自动化流程,我们需要使几个模块等待到上一组模块完成并返回数据管道进入下一个模块数据,在这种情况下,我们可以使用Wait命令直到完成上一个模块。 Wait命令如何工作?...例如,如果我们要等待完成特定进程ID 13245,则当进程13245 完成 wait命令返回13245退出状态返回值,应使用“ wait 13245”。...-wait PID(PID-实用程序要等待终止命令进程ID)。-wait JID(JID-作业ID,标识要等待后台进程,仅适用于当前Shell执行环境中wait调用)。...Wait 命令退出状态值取决于最后指定PID / JID。当任何进程异常终止退出状态将大于128。 当它没有子进程调用并且当前shell知道所有进程ID都已终止,Wait命令以0值退出

    2.3K20

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

    当我们在终端或控制台工作,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要事情要做,比如阅读电子邮件。对于密集访问磁盘进程,我们更希望它能够在每天非负荷高峰时间段运行(例如凌晨)。...为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。 & 当在前台运行某个作业,终端被该作业占据;可以在命令后面加上& 实现后台运行。...在后台运行作业要当心:需要用户交互命令不要放在后台执行,因为这样你机器就会在那里傻等。不过,作业后台运行一样会将结果输出到屏幕上,干扰你工作。...(ps -ef | grep 进程号 或者 kill -9 进程号) nohup 使用&命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户),作业就会停止运行...但是如果任务被终止了(kill),shell 从当前shell环境已知列表中删除任务进程标识。

    2.6K31

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

    我们推测是ssh窗口在关闭,对当前交互shell以及正在运行test.sh等子进程发送某个退出Signal,找了一台装有systemtap机器来验证,所用stap脚本是从涧泉同学那里copy...SIGINT (kill -2) 不会让后台java进程退出原因 为了简便,我们用sleep来模拟进程当我们在交互模式下: $ sleep 1000 & $ ps -opid,pgid,ppid,...按照这个线索我们google后了解到: shell在非交互模式下对后台进程处理SIGINT信号设置是IGNORE。...不开启作业控制的话,脚本后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员传播,因为对它来说这个信号已经没有意义。...回到tomcat例子,catalina.sh脚本通过start参数启动时候,就是以非交互方式后台启动,java进程也被shell设置了忽略SIGINT信号,因此在ctrl-c结束test.sh进程

    4K10

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

    我们推测是ssh窗口在关闭,对当前交互shell以及正在运行test.sh等子进程发送某个退出Signal,找了一台装有systemtap机器来验证,所用stap脚本是从涧泉同学那里copy...SIGINT (kill -2) 不会让后台java进程退出原因 为了简便,我们用sleep来模拟进程当我们在交互模式下: $ sleep 1000 & $ ps -opid,pgid,ppid,...按照这个线索我们google后了解到: shell在非交互模式下对后台进程处理SIGINT信号设置是IGNORE。...不开启作业控制的话,脚本后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员传播,因为对它来说这个信号已经没有意义。...回到tomcat例子,catalina.sh脚本通过start参数启动时候,就是以非交互方式后台启动,java进程也被shell设置了忽略SIGINT信号,因此在ctrl-c结束test.sh进程

    1K10

    Shell内置命令大全,Linux运维工程师收藏!

    现在,每当我们输入ll,实际上是在执行ls -l命令。bgbg命令用于将一个作业置于后台运行。当一个作业被挂起或停止,可以使用bg命令将其切换到后台并继续运行。...示例:bg %1上面的示例中,%1表示作业号为1作业。使用bg %1命令,我们将该作业切换到后台运行。bindbind命令用于显示当前绑定到特定键Shell函数或操作。...示例:sleep 60 &disown在上面的示例中,sleep 60 &命令将sleep命令置于后台运行,并将其作为一个作业。然后,使用disown命令将该作业Shell作业列表中移除。...示例:variables上面的示例中,variables命令将显示当前Shell会话中定义所有变量列表。waitwait命令用于等待后台进程完成。...在上面的示例中,command1和command2是后台进程。wait命令将等待这些后台进程完成后再继续执行后续命令。

    86300

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

    经过测试,有发现: a) 用 ctrl-c 终止当前test.sh进程,系统events进程向 java 和 tail 两个进程发送了SIGINT 信号 b) 关闭ssh终端窗口,sshd向下游进程发送...后来通过google后了解到: shell在非交互模式下对后台进程处理SIGINT信号设置是IGNORE。...交互模式与非交互模式对作业控制(job control)默认方式不同: I)在交互模式下,因为作业控制需要,shell不会对后台进程处理SIGINT信号设置为忽略。...II)而非交互模式下,通常是不需要作业控制,所以作业控制在非交互模式下默认也是关闭(当然也可以在脚本里通过选项set -m打开作业控制选项)。...不开启作业控制的话,脚本后台进程可以通过设置忽略SIGINT信号来避免父进程对组中成员传播,因为对它来说这个信号已经没有意义。

    1.4K10

    Linux:如何脚本开发中实现程序在用户退出后仍保持运行

    在Linux环境下进行脚本开发,常常需要自主管理进程,确保某些关键程序在用户退出后仍能继续运行,而不依赖于systemd这样进程管理工具。本文将探讨如何通过其他方法实现这一目标。...使用nohup命令 nohup命令可以将程序置于后台运行,并在用户退出后继续运行。它会忽略所有的SIGHUP信号,从而防止程序因用户注销而终止。 sh nohup ..../my_script.sh > my_script.log 2>&1 & 使用disown命令 disown命令可以将一个已经在后台运行作业从当前Shell作业列表中移除,这样在用户退出,该作业也不会被发送.../my_script.sh & 使用tmux或screen工具 tmux和screen是两个流行终端复用工具,它们可以创建一个持久会话,在会话中运行程序不会因为用户退出终止。...总结 通过上述方法,我们可以在Linux环境下实现程序在用户退出后继续运行,避免依赖于systemd等进程管理工具。每种方法各有优劣,可以根据具体需求选择最适合方案。

    34110

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

    在有些情况下,我们不希望自己 shell 脚本在运行时刻被中断,比如说我们写得 shell 脚本设为某一用户默认 shell,使这一用户进入系统后只能作某一项工作,如数据库备份,我们可不希望用户使用...以下是一些你可能会遇到常见信号: 信号名称 信号数 描述 SIGHUP 1 本信号在用户终端连接(正常或非正常)结束发出,通常是在终端控制进程结束,通知同一 session 内各个作业,这时它们与控制终端不再关联...登录 Linux ,系统会分配给登录用户一个终端(Session)。在这个终端运行所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。...当用户退出 Linux 登录,前台进程组和后台有对终端输出进程将会收到 SIGHUP 信号。这个信号默认操作为终止进程,因此前台进程组和后台有终端输出进程就会中止。...对于与终端脱离关系守护进程,这个信号用于通知它重新读取配置文件。 SIGINT 2 程序终止(interrupt)信号,在用户键入 Ctrl+C 发出。

    17210

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

    控制终端 每当我们使用终端工具打开一个本地或远程 shell,我们便打开了一个控制终端,通过 ps 命令可以查看到 command 为 ttyn 就是它对应进程了,同时它对应 linux /dev/...这是因为用户注销或者网络断开,SIGHUP信号会被发送到会话所属进程,而此 SIGHUP 默认处理方式是终止收到该信号进程。所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出。...而在 shell 脚本中,我们会发现运行 setsid 进程会一直阻塞住,直到 command 进程执行结束。...而在 shell 脚本内,setsid 不是进程组长,它不会 fork() 子进程,而是由 bash 来fork() 一个子进程,而 bash 会 wait() 子进程,所以表现得像 setsid 在...作业命令 使用上面的后台执行命令可能还会遇到一些小状况: 被我们放在后台进程执行时间过长,而我们又忘记使用 nohup 命令,那么终端一旦断开,进程又需要被重新执行。

    1.7K50

    五.Linux系统进程管理

    交互进程既可以在前台运行,也可以在后台运行。 批处理进程 不与特定终端相关联,提交到等待队列种顺序执行进程。 守护进程(Daemon) 在Linux在启动初始化,需要时运行于后台进程。...):退出状态,进程即将被销毁 1.4 进程启动方式 手工方式:使用操作系统提供用户接口 前台 后台(&) 调度方式:按照预先指定时间执行 at batch cron 1.5 前台进程 指一个程序控制着标准输入...运行后台进程方法是在命令行最后加上 “&” 1.7 进程与作用区别 进程:操作系统概念,由操作系统负责管理 作业shell程序概念,由shell程序负责管理 一个操作系统可以启动多个shell...程序,shell本身也是一个进程 一个作业里至少包含一个进程,也可以包含多个进程 作业分前台和后台运行之分 有了上面的知识,我们可以画出这么一张流程图: ?...|restart 四.安排自动化任务 调度任务守护进程 atd crond 安排调度任务几个命令 at 安排作业在某一刻执行一次 batch 安排作业在系统负载不重执行一次 cron 安排周期性运行作业

    2.5K30

    linux进程管理:进程,程序,线程 & 9个进程管理工具 & 作业控制

    当子进程完成发出(exit)信号请求,在退出,子进程已经关闭或丢弃了其资源环境,剩余部分称之为僵停(僵尸Zombie)。...父进程在子进程退出收到信号而被唤醒,清理剩余结构,然后继续执行其自己程序代码。...后台进程:在 Shell 提示处打入命令,若后随一个 &, Shell 创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与 Shell 同步运行,即在后台运行。...:运行状态 zombie:僵死状态 这些状态是实时变化 作业控制 当我们在Linuxshell中运行程序时,这个程序就可以看成是一个作业了,可以这么说shell控制作业,而不是进程,而且shell...作业控制: 一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以同时运行一个前台作业和任意多个后台作业,这称为作业控制(Job Control)。

    3.4K10

    Linux 进程前台后台切换

    前言当你用shell启动一个程序时,往往他是在前台工作。程序会一直占用终端命令行,例如你在前台解压时候必须等着,期间干不了别的事(除非另开一个终端)。...例如经常用连接到远程服务器执行脚本时候,如果本地网络中断后,这个时候前台进程就结束了,比较懊恼,必须重新执行。简单例子在后台运行一个命令,例如使用&符号。..../shella.sh &使用jobs命令查看后台作业列表。添加-l选项,它提供更详细输出,显示作业详细信息。jobsjobs -l使用fg命令将某个作业切换到前台。例如,如果作业号为1。...kill %1使用 kill %1可以直接终止后台运行程序。nohup ./myscript.sh &这个命令将执行..../myscript.sh脚本,并且即使你退出当前终端,该脚本仍将继续在后台运行(利用ps、jobs等可以查看到)。

    35600

    Linux内核编程--进程组和守护进程

    作业:是一个进程组,作业分为前台作业(前台进程组),后台作业(后台进程组) 会话:会话是若干进程集合。会话有一个前台进程组和多个后台进程组。...对于一个打开控制终端,会话 开始于用户登录,终止于用户退出。...守护进程没有控制终端通常源于它们由系统初始化脚本启动,然而守护进程也可能从某个终端由用户在shell提示符下键入命令行启动,这样守护进程必须亲自脱离于控制终端关联,从而避免与作业控制、终端会话管理...(2)守护进程在关闭终端(比如Xshe11)时候不会受到影响,而后台进程将在终端关闭后自动退出。 守护进程启动方式: 1.在系统启动阶段,由系统初始化脚本启动。...这些脚本通常位于/etc目录或以/etc/rc开头某个目录中。由这些脚本启动守护进程一开始拥有超级用户权限。

    3K20

    进程ID及进程关系

    在子进程退出且父进程完成回收前,子进程变成僵尸进程。僵尸进程持续时间通常比较短,在父进程回收它资源后就会消亡。如果父进程没有处理子进程终止,那么子进程就会一直处于僵尸状态。...会话是用户登录系统到退出所有活动,从登录到结束前创建所有进程都属于这次会话。登录后第一个被创建进程(通常是 shell),被称为 会话 leader。 进程组用于作业控制。...这时这个作业是前台任务,可以控制终端。当我们按下 Ctrl + z,会发送信号 SIGTSTP 给前台进程所有进程,该信号缺省行为是暂停作业执行。...当终端关闭,会向整个会话发送 SIGHUP 信号,通常情况下,这个会话所有进程都会被终止。...如果想让运用在后台进程不随着 session 结束而退出,可以使用 nohup 命令忽略 SIGHUP 信号: $ nohup command >cmd.log 2>&1 & 即使 shell 结束

    53523
    领券