Linux Daemon赢了';不要杀死正在读命名管道的孩子

Linux Daemon赢了';不要杀死正在读命名管道的孩子,linux,bash,unix,daemon,named-pipes,Linux,Bash,Unix,Daemon,Named Pipes,我编写了这个bash守护程序,它监视命名管道,将它看到的所有内容记录在名为$LOG\u file\u BASENAME.$DATE的文件中,并在$ACTIONABLE\u LOG\u file中创建它的过滤版本: while true do DATE=`date +%Y%m%d` cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_

我编写了这个bash守护程序,它监视命名管道,将它看到的所有内容记录在名为
$LOG\u file\u BASENAME.$DATE
的文件中,并在
$ACTIONABLE\u LOG\u 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
守护进程运行时,进程表的外观如下:

/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进程。相反,它们会成为孤儿并继续等待命名管道上的输入

一旦FIFO接收到一些输入,它们就会按照指令处理该输入,然后死亡


我怎样才能让守护进程在死亡之前杀死它的孩子?为什么它们不会随着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

更新:

根据替换


您是如何创建fifo并写入它的?“如果守护进程生成的数据没有被父级收集,“为什么您希望它们被收集?”为什么它们没有与
pkill-P$$
一起死亡?“因为该语句从未发出,当您发送脚本时,请使用
SIGTERM
。我建议您使用后台管道,然后
等待$
允许脚本在收到术语后立即终止,而不是在管道完成时终止。(否则,
trap
将不会弹出,直到shell处于命令之间。)
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 $!