我在启动时启动了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启动的
答案 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
也不会比你提供的脚本更加活泼。