AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 551455
Accepted
Scott M
Scott M
Asked: 2019-11-11 14:04:39 +0800 CST2019-11-11 14:04:39 +0800 CST 2019-11-11 14:04:39 +0800 CST

如果从 /etc/rc.local 启动的进程完成,kill() 不会停止子进程?

  • 772

在树莓派(最近的树莓派)上,我编写了一个应用程序,它通过网络请求按需生成一个应用程序,并通过不同的网络请求按需杀死它。生成机制只是 fork/exec。使用 kill(childPid, SIGQUIT) 完成杀戮。正如您所想的那样,它就像一块简单的 C++,并且运行良好。

也就是说,它工作正常,除非我从 /etc/rc.local 启动它。从那里启动它的命令只是一个适当的 cd 然后

    ./effectPlayer &

它启动正常,接收请求正常,生成正常(它跨越一个 aplay,因此判断它何时工作是微不足道的)但完全无法根据请求杀死 aplay 子进程。它正常调用 kill() 并且 kill() 返回 0。但是 aplay 继续播放。

我认为这与从 /etc/rc.local 生成它在 fork 或 kill 中赋予它一些特殊行为这一事实有关,但我不明白是什么。我错过了什么?

编辑:添加问题的答案。从 /etc/rc.local 运行并打开日志记录,应用程序报告:

    23:10:06 10-11-2019 (effectPlayer) 7: P1 64 elvenHall  #command to start playing
    23:10:06 10-11-2019 (sound) launched 1083: /usr/bin/aplay -q -... #what it forks/execs
    23:10:10 10-11-2019 (effectPlayer) 7: X1000 #command to stop playing
    23:10:10 10-11-2019 (sound) sending 3 to 1083, result 0 0 #what kill() is asked to do

翻译,它被要求播放一个特定的效果并产生一个 aplay 来处理它。它可以工作(我听到音频),然后我发送一个命令停止所有播放。它使用正确的信号成功地在正确的 PID 上调用 kill(),并且 kill() 返回 0 且 errno=0。除了 aplay 仍在运行。

当我从命令行执行相同的序列时,它的作用都是一样的,除了 aplay 实际上死了。

当我将 SIGQUIT 换成 SIGKILL 时,它按预期工作:无论 effectsPlayer 如何启动,aplay 都会死掉。

我现在要把它归结为游戏中的一些奇怪之处。我不喜欢使用 SIGKILL - 可能会跳过重要的清理工作。但它的工作...

kill
  • 2 2 个回答
  • 457 Views

2 个回答

  • Voted
  1. Best Answer
    ctrl-d
    2019-11-12T12:31:22+08:002019-11-12T12:31:22+08:00

    可能是您从引导脚本继承了对 SIGQUIT 的忽略,因为 fork 和 exec 不理会这些。在你的父程序中将 SIGQUIT 重置为默认状态来试试这个。

    • 1
  2. Craig Small
    2019-11-11T19:09:27+08:002019-11-11T19:09:27+08:00

    由于在 rc.local 下运行不太可能导致这种情况。

    首先,检查父进程是否真的在发送信号(您可能需要一些调试行)并且子进程没有被杀死(运行 pgrep aplay,让父进程杀死,然后再次执行 pgrep aplay)。我还将假设您在这里没有任何 SELINUX 或其他 MAC 异常。

    没有响应 kill() 的进程归结为几件事:权限、处理和 PID。听起来您有一个父进程“effectPlayer”,它会产生一个子进程“aplay”,并且 effectPlayer 正在向子进程发送信号 QUIT。

    假设您没有对 setuid 和朋友做任何奇怪的事情,父母和孩子都将拥有相同的所有者,所以这没关系。

    可以屏蔽退出信号,但我很确定 aplay 不会那样做。所以这是一种可能。您可以将 SIGQUIT 更改为 SIGKILL 以查看它是否会改变。

    最后是PID。你确定它是正确的pid吗?再次,一些调试行说明您尝试杀死的 PID 并将其与 ps 命令匹配将对此进行测试。有时您可能会在 shell 中使用 exec 并且您正在杀死错误的进程。

    • 0

相关问题

  • `kill <PID list>` 是否确定了正确的杀戮顺序(或者它是否进行了正确的重试)?

  • 等待的 pkill

  • 有什么方法可以杀死或结束“磁盘睡眠”中的进程

  • 默默杀死subshel​​l?

  • 从后台进程退出脚本?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve