2012-09-04 59 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