守护进程不会杀死正在读取命名pipe道的孩子

我已经写了这个bash守护进程,它关注了一个命名pipe道,logging了一个名为$LOG_FILE_BASENAME.$DATE的文件,并在$ACTIONABLE_LOG_FILE创build了它的过滤版本:

 while true do DATE=`date +%Y%m%d` cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_LOG_FILE" done pkill -P $$ # Here it's where it should kill it's children exit 0 

当守护进程运行时,这就是进程表的外观:

 /bin/sh the_daemon.sh \_ cat the_fifo_queue \_ tee -a log_file.20150807 \_ grep -P -v "regexp" > filtered_log_file 

问题是当我杀死守护进程(SIGTERM)时,由守护进程产生的cat,tee和grep进程不会被父进程收集。 相反,他们成为孤儿,并继续等待命名pipe道上的input。

一旦FIFO接收到一些input,则它们按照指示处理该input并死亡。

如何让守护进程在死亡之前杀死自己的孩子? 为什么他们不死于pkill -P $$

你想为你的脚本设置一个信号处理程序,以防脚本自身得到信号时终止其进程组的所有成员(它的子程序):

 #!/bin/bash function handle_sigterm() { pkill -P $$ exit 0 } trap handle_sigterm SIGTERM while true do DATE=`date +%Y%m%d` cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_LOG_FILE" done handle_sigterm exit 0 

更新:

根据pilcrow的评论替换

 cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_LOG_FILE" 

通过

 cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_LOG_FILE" & wait $!