Python 无法捕获来自';码头停靠站';
这是我在CMD中使用的bash脚本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
#!/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完成。。。现在,主进程是正在等待的进程。。所以任何码头工人的信号都会直接到达我们在上面设置的陷阱
有关示例,请访问:
这太微妙了!谢谢你的回答!太微妙了!谢谢你的回答!