bash:等等似乎没有回复

时间:2017-09-09 08:15:02

标签: bash signals wait

我在Postfix周围使用以下包装器在Docker容器(安装了bash和coreutils的Alpine 3.6)中运行它:

#!/usr/bin/env bash
#
# Starts Postfix and waits for its master process to exit.

set -eo pipefail

MASTER_PID=

main() {
  # Start Postfix
  postfix start

  # Wait for Postfix to start
  while [ ! -f /var/spool/postfix/pid/master.pid ]; do sleep 1; done

  # Read the PID of Postfix's master process
  MASTER_PID=$(cat /var/spool/postfix/pid/master.pid | tr -d '[:space:]')
  readonly MASTER_PID

  # Wait for Postfix to exit
  tail -f /dev/null --pid "$MASTER_PID" &
  wait "$!"

  printf "Postfix Done\n"
}

shutdown() {
  printf "Stopping Postfix\n"
  # Stop Postfix
  postfix stop
}

# Add signal handlers for stopping Postfix
trap shutdown SIGINT SIGTERM

main

我使用tail等待Postfix的主进程退出,因为它不是执行脚本的shell的子进程。但是,tail进程是并且我期望wait "$!"等待尾部退出,这在Postfix的主进程退出时发生。这对于允许信号处理是必要的,它似乎有效:当发送SIGTERM时,Postfix停止并且脚本终止。但是永远不会打印Postfix Done。原因是什么?有趣的是,用

替换wait "$!"
TAIL_PID="$!"
while kill -0 "$TAIL_PID" 2>/dev/null; do sleep 1; done;

一切正常,Postfix Done按预期打印。

0 个答案:

没有答案