我有一个脚本需要在另一个程序中循环运行。但我想捕获信号以优雅地停止循环。
这是我的可重现代码:
loop.sh
:
#!/bin/bash
COMMAND="logic.sh"
terminate=false
trap 'terminate=true' SIGTERM SIGINT
while true; do
if $terminate; then
echo "Termination signal received, waiting for the current process to finish..."
wait
echo "Process finished. Exiting..."
exit 0
fi
$COMMAND &
wait $!
done
logic.sh
:
#!/bin/bash
sleep 5
date +%s
Dockerfile
:
# FROM debian
FROM php:8.3-fpm
ADD loop.sh logic.sh /usr/local/bin/
CMD ["loop.sh"]
compose.yml
:
services:
app:
build: .
entrypoint: ''
init: true
为了测试它,我运行
docker compose up --build
;并在另一个终端docker compose stop
。
如果您看到 Termination signal received, waiting for the current process to finish...
然后是时间戳,则说明它正在工作。
使用 FROM php:8.3-fpm
时,它无法按预期工作...但是使用 FROM debian
时,可以。
为什么它的行为不一样?我怎样才能使它与
FROM php:...
一起工作?如果您使用
检查图像历史记录docker history php:8.3-fpm
您将看到该图像使用
QUIT
信号来通知进程是时候清理并离开了:
<missing> 11 days ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
这意味着如果您想优雅地退出所包含的进程,您应该在陷阱中添加
QUIT
信号。