Linux Daemon赢了';不要杀死正在读命名管道的孩子
我编写了这个bash守护程序,它监视命名管道,将它看到的所有内容记录在名为Linux Daemon赢了';不要杀死正在读命名管道的孩子,linux,bash,unix,daemon,named-pipes,Linux,Bash,Unix,Daemon,Named Pipes,我编写了这个bash守护程序,它监视命名管道,将它看到的所有内容记录在名为$LOG\u file\u BASENAME.$DATE的文件中,并在$ACTIONABLE\u LOG\u file中创建它的过滤版本: while true do DATE=`date +%Y%m%d` cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_
$LOG\u file\u BASENAME.$DATE
的文件中,并在$ACTIONABLE\u LOG\u 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$$$而消亡?
您希望为脚本设置一个信号处理程序,在脚本本身收到信号时,该处理程序会杀死其进程组(其子进程)的所有成员:
#!/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
更新: 根据替换 借
您是如何创建fifo并写入它的?“如果守护进程生成的数据没有被父级收集,“为什么您希望它们被收集?”为什么它们没有与
pkill-P$$
一起死亡?“因为该语句从未发出,当您发送脚本时,请使用SIGTERM
。我建议您使用后台管道,然后等待$
允许脚本在收到术语后立即终止,而不是在管道完成时终止。(否则,trap
将不会弹出,直到shell处于命令之间。)
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 $!