我已经编写了这个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 $$
死亡?
答案 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
更新
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 $!