【发布时间】:2023-03-20 06:56:01
【问题描述】:
我编写了这个 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 $$?
【问题讨论】:
-
你是如何创建fifo并写入它的?
-
“由守护进程生成的地方没有被父进程收集”你为什么期望它们被收集?
-
“他们为什么不和
pkill -P $$一起死?”因为声明永远不会发布,因为您将脚本发送到SIGTERM。
标签: linux bash unix daemon named-pipes