守护进程不会杀死从命名管道中读取的孩子

时间:2015-08-07 21:14:05

标签: linux bash unix daemon named-pipes

我已经编写了这个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

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

/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 $$死亡?

1 个答案:

答案 0 :(得分:4)

您希望为脚本设置信号处理程序,以便在脚本本身发出信号时杀死其进程组(其子组件)的所有成员:

#!/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's comment替换

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