2012-09-04 55 views
1

我写的/etc/init.d/mydaemon杀守护进程的所有子进程

# ... 
source functions # LSB compliant 

EXEC=/usr/local/bin/mydaemon 
PROG=mydaemon 

function start() { 
    daemon --pidfile=/var/run/mydeamon.pid ${EXEC} 
} 

function stop() { 
    killproc ${PROG} 
} 

# ... 

/usr/local/bin/mydaemon

#!/bin/bash 
trap "trap TERM ; kill 0" TERM 
binary with some args 

AFAIK,这应该工作,因为:

  • daemon记录mydaemon“ s PID in /var/run/mydaemon.pid
  • killproc读取该PID并将SIGTERM发送到该PID。
  • mydaemon捕获此信号,禁用陷阱并发送SIGTERM至整个PGRP,包括binary with some args的过程。

但是这不起作用。停止服务后,mydaemon终止,但binary仍在运行。

我错过了什么,和停止守护进程及其所有子进程的最佳做法是什么?


BTW:

当我在/ usr/local/bin目录/ mydaemon是:

#!/bin/bash 
binary with some args & 
echo $! $$ > /var/run/mydaemon.pid 
wait 

它可以正常工作,但这似乎不太可靠的我,有次在那里这是不合适的(当二进制调用不太直截了当,或者它有自己的孩子等)。

回答

2

如果给父进程ID为pkill,它会杀死所有的孩子:

pkill -TERM -P parentID 
0

您可以设置一个trap,当接收到SIGINT时采取清理过程的照顾。例如:

function cleanup { kill $CHILDPID; exit 0; } 
trap cleanup SIGINT SIGTERM 

有关更多示例,请参阅here