Python 无法捕获来自';码头停靠站';

Python 无法捕获来自';码头停靠站';,python,bash,docker,signals,Python,Bash,Docker,Signals,这是我在CMD中使用的bash脚本 #!/bin/bash set -eo pipefail echo "Setting trap" echo $$ echo $BASHPID trap 'cleanup' TERM trap 'cleanup' KILL cleanup() { echo "Cleaning up..." kill -TERM `jobs -p` } # To start the essential services service ntp start

这是我在CMD中使用的bash脚本

#!/bin/bash
set -eo pipefail

echo "Setting trap"
echo $$
echo $BASHPID
trap 'cleanup' TERM
trap 'cleanup' KILL

cleanup() {
    echo "Cleaning up..."
    kill -TERM `jobs -p`
}


# To start the essential services
service ntp start
service awslogs start

cd /app
python -m job_manager  &

wait
Docker文件不是很有趣

FROM ubuntu:16.04

RUN apt-get update --fix-missing && apt-get install -y \
  git \
  python \
  python-pip \
  ntp \
  curl

ENV APP_HOME /app
RUN mkdir -p ${APP_HOME}
COPY src/ ${APP_HOME}/

# job-cmd.sh is kept here    
COPY docker/helper-files/* /   

CMD /job-cmd.sh
其思想是将术语信号捕获到job-cmd.sh中,然后传递给python任务

我试了很多次,但都没有成功。在我添加这些调用之后

echo $$
echo $BASHPID
我意识到CMD进程的pid实际上是7,而不是我预期的1

我的问题是:

1) 为什么bash进程被指定为PID 7


2) 如何修复我的作业脚本/dockerfile?

我认为这是因为您使用的是
CMD
指令的
shell
形式。发件人:

如果希望在没有shell的情况下运行命令,则必须将命令表示为JSON数组,并给出可执行文件的完整路径。此数组形式是CMD的首选格式

因此,将
Dockerfile
中的
CMD
指令替换为:

CMD ["/job-cmd.sh"]
然后将为您的Bash进程分配
PID 1
。您的
术语
处理程序将工作,但无法捕获
KILL
信号。从
人工陷阱

捕获SIGKILL或SIGSTOP在语法上为一些历史实现所接受,但它没有任何效果。便携式POSIX应用程序无法尝试捕获这些信号


仅供参考,我在这里详细解释了
PID 1
问题:

我认为这是因为您使用的是
CMD
指令的
shell
形式。发件人:

如果希望在没有shell的情况下运行命令,则必须将命令表示为JSON数组,并给出可执行文件的完整路径。此数组形式是CMD的首选格式

因此,将
Dockerfile
中的
CMD
指令替换为:

CMD ["/job-cmd.sh"]
然后将为您的Bash进程分配
PID 1
。您的
术语
处理程序将工作,但无法捕获
KILL
信号。从
人工陷阱

捕获SIGKILL或SIGSTOP在语法上为一些历史实现所接受,但它没有任何效果。便携式POSIX应用程序无法尝试捕获这些信号


仅供参考,我在这里解释了有关
PID 1
问题的更多信息:

您可以在bash中使用trap命令来执行此操作

#!/bin/bash
#

function gracefulShutdown {
  echo "Shutting down!"
  # do something..
}
trap gracefulShutdown SIGTERM TERM INT

./subprocess.sh &

tail --pid=${!} -f /dev/null &
wait "${!}"
tail命令只是等待子进程完成,而wait命令则等待tail完成。。。现在,主进程是正在等待的进程。。所以任何码头工人的信号都会直接到达我们在上面设置的陷阱

有关示例,请访问:


您可以在bash中使用trap命令来执行此操作

#!/bin/bash
#

function gracefulShutdown {
  echo "Shutting down!"
  # do something..
}
trap gracefulShutdown SIGTERM TERM INT

./subprocess.sh &

tail --pid=${!} -f /dev/null &
wait "${!}"
tail命令只是等待子进程完成,而wait命令则等待tail完成。。。现在,主进程是正在等待的进程。。所以任何码头工人的信号都会直接到达我们在上面设置的陷阱

有关示例,请访问:


这太微妙了!谢谢你的回答!太微妙了!谢谢你的回答!