我已经编写了这个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 $!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。