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
更新:
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