我已经写了这个bash守护进程,它关注了一个命名pipe道,logging了一个名为$LOG_FILE_BASENAME.$DATE
的文件,并在$ACTIONABLE_LOG_FILE
创build了它的过滤版本:
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进程不会被父进程收集。 相反,他们成为孤儿,并继续等待命名pipe道上的input。
一旦FIFO接收到一些input,则它们按照指示处理该input并死亡。
如何让守护进程在死亡之前杀死自己的孩子? 为什么他们不死于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
更新:
根据pilcrow的评论替换
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 $!