当信号到来时杀死 bash 脚本前台子进程

2024-03-23

我将 fastcgi 应用程序包装在 bash 脚本中,如下所示:

#!/bin/bash
# stuff
./fastcgi_bin
# stuff

由于 bash 仅在前台脚本结束时执行信号陷阱,所以我不能只是kill -TERM scriptpid因为 fastcgi 应用程序将保持活动状态。
我尝试将二进制文件发送到后台:

#!/bin/bash
# stuff
./fastcgi_bin &
PID=$!
trap "kill $PID" TERM
# stuff

但是如果我这样做,显然标准输入和标准输出没有正确重定向,因为它没有与lighttpds mod_fastgi连接,前台版本确实可以工作。

EDIT:我一直在研究这个问题,发生这种情况是因为当程序在后台启动时 bash 将 /dev/null 重定向到 stdin,所以任何避免这种情况的方法也应该解决我的问题。

关于如何解决这个问题有任何提示吗?


我想到了一些选择:

  • 当从 shell 脚本启动进程时,两者都属于同一进程组。杀死父进程会使子进程存活,因此应该杀死整个进程组。这可以通过将否定的PGID(进程组ID)传递给kill来实现,它与父进程的PID相同。英语:kill -TERM -$PARENT_PID

  • 不要执行二进制文件 一个孩子,但替换了脚本 处理与exec。你失去了 之后执行事情的能力 不过,因为exec完全地 替换父进程。

  • 不要杀死 shell 脚本进程,而是杀死 FastCGI 二进制文件。然后,在脚本中检查返回代码并采取相应措施。例如:./fastcgi_bin || exit -1

根据 mod_fastcgi 处理工作进程的方式,只有第二个选项可能是可行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当信号到来时杀死 bash 脚本前台子进程 的相关文章

  • 目录 * 和文件顺序

    我需要将目录中的所有文件连接到一个文件 但具有指定名称的文件必须位于输出的顶部 只是在做cat gt result将按字母顺序连接所有文件 有什么办法告诉猫放置文件vars css或任何其他输出的开头 现在我只是重命名文件需要首先000 f
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 如何将参数传递给java bash脚本? [复制]

    这个问题在这里已经有答案了 我有一个简单的 bash 脚本来运行我的 java 程序 就这个 run sh bin sh java jar target my jar arch jar 我想将参数传递给这个脚本 该脚本必须将它们传递给jav
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • 如何使用testing-library/no-node-access访问props.children

    我已经安装成功了eslint 插件测试库 https github com testing library eslint plugin testing library并使用overrides所以它只警告我测试文件中的代码 然而 它抱怨Avo
  • 使用 sed 删除非字母数字字符

    我正在尝试验证一些输入以删除一组字符 只允许使用字母数字字符加 句点 下划线 连字符 我测试了正则表达式 w here http gskinner com RegExr http gskinner com RegExr 它与我想要删除的内容
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 如何修复“iptables:没有该名称的链/目标/匹配”?

    我在我的 Linux 嵌入式系统上构建并安装了 iptables 如果我列出所有规则 则一切正常 iptables list Chain INPUT policy ACCEPT target prot opt source destinat
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh

随机推荐

  • 汇编编码 strdup. Malloc 在共享库中调用

    我有一个问题 调用 malloc 时无法编译 strdup 当我不调用 malloc 时 它会完美地编译我的共享库 所以如果有人可以帮助我 那就太好了 这是我的代码 BITS 64 DEFAULT REL global my strdup
  • 如何修复 Chunk.modulesIterable 的弃用警告?

    我是的维护者外部 svg sprite loader https github com karify external svg sprite loader我注意到 当将它与 webpack 5 一起使用时 我收到以下警告 DEP WEBPA
  • 如何编写将所有参数转发给委托命令的包装器 powershell 命令?

    wrapper应该只是打电话delegate 转发传递给包装器的参数 Given wrapper ps1 1 2 Whendelegate ps1 内容 param one two write host one one and two tw
  • 通过连接池发出 http 请求时 Akka Flow 挂起

    我正在使用 Akka 2 4 4 并尝试从 Apache HttpAsyncClient 迁移 未成功 下面是我在项目中使用的代码的简化版本 问题是 如果我向流程发送超过 1 3 个请求 它就会挂起 到目前为止 经过6个小时的调试 我什至找
  • 基于模板的主题观察者模式 - 我应该使用 static_cast 还是dynamic_cast

    我指的是这篇文章使用模板实现主题 观察者模式 http www codeproject com KB architecture observer with templates aspx 我做了一些修改 代码如下 template
  • 找到 O(n) 中所有成员都在列表中的最大区间 [重复]

    这个问题在这里已经有答案了 我在一次采访中被问到这个问题 给定一个整数列表 我们如何找到其所有成员都在给定列表中的最大区间 例如 给定列表 1 3 5 7 4 6 10 那么答案将是 3 7 因为它具有 3 到 7 之间的所有元素 我试图回
  • 使用多个 websocket 连接

    我有一个网站 每月有几千次访问 而且还在不断增长 我正在向我的网站添加新的交互式功能 现在我正在处理一个问题 我应该为所有功能使用一个 websocket 连接 还是应该为我的应用程序的每个交互功能创建新的 websocket 连接 我正在
  • 移动名称中带有空格的文件

    我在 unix 中有一个文件 名称为 这是我的文件 xls 我想将它从一个文件夹移动到另一个文件夹 我写了以下几行 fileName this is my file myDate 20121125 mv FIRST DIR fileName
  • 使用ajax将Flash视频加载到div中

    我有一个客户希望能够从视频缩略图播放列表中进行选择 并且它会替换页面上已有的视频 我还需要观察加载时间 因此认为如果使用 ajax 单击每个视频 则请求该视频会更好吗 我是 ajax 新手 所以不确定这是否是最好的选择 我的页面如下 div
  • /arm64/Image 到 zImage 或 boot.img

    大家好 我一直在试图弄清楚如何使我的 android 内核成为 zImage 或 boot img 我试图弄清楚但没有运气 有人告诉我 zImage 不适用于我的设备 因为它是 arm64 内核 但我想我会再问一次 如果是这种情况 我会尝试
  • 在 MongoDB Spring Data 中使用多个方面

    我想在一个聚合中运行多个方面以节省数据库往返次数 这是我的弹簧数据代码 final BalancesDTO total this mongoTemplate aggregate newAggregation Get all fund tra
  • 对 ole db 提供程序“microsoft.ace.oledb.12.0”的临时访问已被拒绝。您必须通过链接服务器访问该提供商

    当尝试在sql server中导入excel文件时 出现上述错误 转到链接服务器 gt 提供程序 然后双击您在 OPENROWSET 查询中使用的提供程序 然后检查是否 禁止临时访问 是否启用如下所示 您还可以在注册表中的 HKEY LOC
  • 了解递归函数的工作原理

    正如标题所解释的 我有一个非常基本的编程问题 但我还无法理解 过滤掉所有 极其聪明的 为了理解递归 必须先理解递归 网上各种帖子的回复我还是不太明白 了解当面对不知道我们不知道的事情时 我们可能会倾向于提出错误的问题或错误地提出正确的问题我
  • Nodejs为Redis请求设置超时

    我编写了一个简单的服务 使用 redis 将数据存储在内存中或从磁盘中获取数据 然后存储在内存中 并希望为慢速请求设置超时 我希望找到一种方法发出带有超时的获取请求 以防止该请求挂起 任何帮助表示赞赏 因此 您可以在这里做一些事情 但是 首
  • MonoDroid 的 MVVM 框架?

    MonoDroid 已经有 MVVM 框架了吗 或者 MonoDroid 是否能够自行绑定属性和命令 例如用于 WPF Silverlight WP7 的 MVVM Light Toolkit 还没有 MVVM 但是有 MonoCross
  • 带 POST 参数的 FacesContext 重定向

    我需要使用 POST 参数将页面重定向到外部站点 但我无法使用普通 HTML
  • OpenCV 变换矩阵:仿射与透视扭曲

    您好 我目前正在研究图像转换 但有一件关于扭曲的事情我不明白 即有什么区别warpAffine http docs opencv org 2 4 modules imgproc doc geometric transformations h
  • 过期的消息不会从 RabbitMQ 中删除

    我通过生产者向 RabbitMQ 发送一条普通消息 然后发送第二条消息expiration属性分配给一个值 然后使用rabbitmqctl list queues命令我监视消息的状态 我发现如果我先发送一条普通消息 然后发送一条消息expi
  • SharePoint 在代码隐藏中获取当前页面的完整 URL

    在 SharePoint 中 如何从隐藏代码中获取当前页面的 url 例如包含 blah aspx 页面 SPContext Current Web Url 给出http vm en http vm en 我需要它http vm en Pa
  • 当信号到来时杀死 bash 脚本前台子进程

    我将 fastcgi 应用程序包装在 bash 脚本中 如下所示 bin bash stuff fastcgi bin stuff 由于 bash 仅在前台脚本结束时执行信号陷阱 所以我不能只是kill TERM scriptpid因为 f