无法终止在启动时使用守护进程启动的进程

时间:2014-09-02 11:37:01

标签: process boot termination

我在启动时启动了fooinit.rt进程(/etc/init.d/boot.local)

这是boot.local文件

...
/bin/fooinit.rt &
...

我在作业中创建一个订单列表以杀死fooinit.rt。在C代码中触发

我写了一个停止脚本(in),写了kill -9 pidof fooinit.rt 这是停止脚本

#!/bin/sh
proc_file="/tmp/gdg_list$$"
ps -ef | grep $USER > $proc_file
echo "Stop script is invoked!!"
suff=".rt"
pid=`fgrep "$suff" $proc_file | awk '{print $2}'`
echo "pid is '$pid'"
rm $proc_file

当作业计时器到期时,杀死-9 pid'(fooinit.rt)命令无法终止fooinit.rt进程!!

我检查了打印的pid号码和句子"停止脚本被调用!!"好的!

这是" at" C代码中的作业命令(我验证了1分钟后调用停止脚本)

...
case 708: /* There is a trigger signal here*/
{
    result = APP_RES_PRG_OK;
    system("echo '/sbin/stop' | at now + 1 min");

 }
...

另一方面,它可以在从shell手动启动fooinit.rt作为普通命令的情况下正常工作。 (不是来自/etc/init.d/boot.local)。所以kill -9工作并终止fooinit.rt进程

你知道为什么kill -9无法终止foo.rt进程,如果它是从/etc/init.d/boot.local启动的

1 个答案:

答案 0 :(得分:0)

您的解决方案是围绕竞争条件构建的。无法保证它会杀死正确的进程(在ps调用和使用pid的尝试之间可以传递不可知的时间),而且它也容易受到tmp攻击:有人可以创建一个/ tmp下的几千个符号链接称为" gdg_list [1-32767]"指向/ etc / shadow,如果它以root身份运行,您的脚本将覆盖/ etc / shadow。

另一个潜在的问题是$USER的设置 - 你确定它是正确的吗?您的工作将被称为您的C程序运行的用户,可能与您的fooinit.rt运行的用户不同。

此外,您的脚本根本不包含kill命令。

更简洁的方法是在runit之类的流程主管下运行你的fooinit.rt,并在不再需要时使用runit将其关闭。这避免了pid宾果以及/ tmp攻击向量。

但即使使用pkill -u username -f fooinit.rt也不会比你提供的脚本更加活泼。