守护进程不会杀死正在从命名管道读取的 children

Daemon won't kill children that are reading from a named pipe

我写了这个 bash 守护进程,它密切关注命名管道,将它看到的所有内容记录在名为 $LOG_FILE_BASENAME.$DATE 的文件中,它还在 $ACTIONABLE_LOG_FILE:

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

当守护进程是 运行 时,进程 table 看起来是这样的:

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

问题是,当我终止守护进程 (SIGTERM) 时,parent 未收集由守护进程生成的 cat、tee 和 grep 进程。相反,它们成为孤儿并继续等待命名管道上的输入。

一旦 FIFO 接收到一些输入,它们就会按照指示处理该输入并死掉。

如何让守护进程在死前杀死它的 children?为什么他们不死于 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

更新:

根据替换

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 $!