gpt4 book ai didi

c - 从引导脚本启动时,程序无法终止 () 进程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:11 24 4
gpt4 key购买 nike

我确定我的问题之前可能已得到解答,但在搜索了一段时间后我没有找到任何适合我的情况的内容。

背景:

我用 C 编写了一套数据采集工具,可在运行 Debian Wheezy 的嵌入式系统上运行。有一个名为 Dispatch 的主模块,其工作是启动其余模块并在它们之间传递消息。我在 /etc/init.d 中放置了一个简单的 bash 脚本在系统启动时执行 Dispatch,因为该系统在无人值守的情况下运行。该系统在没有任何本地用户交互的情况下运行,因此 Dispatch 实际上应该被编写为作为守护进程运行,但事实并非如此。启动脚本只是执行 /opt/bcdispatch & .

其他模块之一中存在一个错误,导致它每隔几天就会崩溃。我正试图找出那个错误,但与此同时我正在尝试编写一个看门狗程序来检测崩溃,终止我的所有进程,然后重新启动 Dispatch。由于我不会深入的原因,仅仅重新启动崩溃的进程是不够的,需要重新启动整套工具。

我正在尝试做的事情:

我写了一个简单的看门狗程序,定期执行 popen("ps aux | grep bc") (我所有的进程名称都以“bc”开头,这使得使用 grep 很容易找到它们),通过在从 popen() 读取的任何行中查找具有“僵尸”状态的任何内容,发现其中一个模块已崩溃。 , 通过调用 system("kill <PID>") 杀死我所有的进程, 然后执行 /etc/init.d 中的启动脚本并退出。我修改了启动脚本,使其在启动 Dispatch 后启动看门狗。启动脚本现在看起来像:

/opt/bcdispatch &
/opt/mywatchdog &

一切都以root身份运行。系统上没有其他用户帐户。

问题

如果我从命令行运行看门狗进程,它工作正常。它终止了它应该终止的所有进程,启动启动脚本,然后退出。但是,当启动脚本在启动时启动看门狗时,它不会执行任何操作。它正在运行,它监视的进程之一已经崩溃,但它并没有杀死其余进程。它就像一个巨大的粪便一样坐在那里。我可以从命令行启动它的另一个实例,那个实例工作得很好。

问题

所以我的问题(终于!)是:为什么我的程序在通过启动脚本启动时不能终止其他进程?我怀疑这与看门狗进程不再有与之关联的终端这一事实有关?我尝试将调用替换为 system("kill <PID>")kill(PID)但这并没有改变任何东西。

编辑

我只是想到不是 kill()ing 部分不起作用(好吧,它也可能被破坏),对 popen("ps aux | grep bc") 的调用一定不起作用因为看门狗在找到僵尸进程后应该退出,但事实并非如此。它的 PID 仍然和系统启动时一样。我想这意味着这个问题的标题不是很好。

最佳答案

发现问题。我的看门狗调用 popen("ps aux | grep bc") 的输出被截断为 80 列,大概是因为它不再连接到终端,这是默认的终端宽度。该截断导致程序解析 ps 命令结果的方式出现问题,因此它从未找到崩溃的进程。只需将命令更改为 popen("ps -w aux | grep bc") 即可修复它。

关于c - 从引导脚本启动时,程序无法终止 () 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com