微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐