守护进程不会杀死正在从命名管道读取的 children
Daemon won't kill children that are reading from a named pipe
我写了这个 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
当守护进程是 运行 时,进程 table 看起来是这样的:
/bin/sh the_daemon.sh
\_ cat the_fifo_queue
\_ tee -a log_file.20150807
\_ grep -P -v "regexp" > filtered_log_file
问题是,当我终止守护进程 (SIGTERM) 时,parent 未收集由守护进程生成的 cat、tee 和 grep 进程。相反,它们成为孤儿并继续等待命名管道上的输入。
一旦 FIFO 接收到一些输入,它们就会按照指示处理该输入并死掉。
如何让守护进程在死前杀死它的 children?为什么他们不死于 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 守护进程,它密切关注命名管道,将它看到的所有内容记录在名为 $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
当守护进程是 运行 时,进程 table 看起来是这样的:
/bin/sh the_daemon.sh
\_ cat the_fifo_queue
\_ tee -a log_file.20150807
\_ grep -P -v "regexp" > filtered_log_file
问题是,当我终止守护进程 (SIGTERM) 时,parent 未收集由守护进程生成的 cat、tee 和 grep 进程。相反,它们成为孤儿并继续等待命名管道上的输入。
一旦 FIFO 接收到一些输入,它们就会按照指示处理该输入并死掉。
如何让守护进程在死前杀死它的 children?为什么他们不死于 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 $!