系统相关
首页 > 系统相关> > linux-守护程序不会杀死正在从命名管道读取的子级

linux-守护程序不会杀死正在从命名管道读取的子级

作者:互联网

我已经编写了这个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)时,父进程未收集由守护程序生成的猫,T恤和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

更新:

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

标签:bash,unix,daemon,named-pipes,linux
来源: https://codeday.me/bug/20191028/1949086.html