我一直在使用一个简单的脚本,其中有一个while循环作为Docker容器的入口点,每分钟运行一个命令。一种简单的cronjob可以这么说。while循环看起来像这样:
#!/bin/sh
while [ true ]
do
php script.php &
sleep 60
done
字符串
在我更新了Alpine 3.18的基础镜像之前,这一直工作得很好,现在它不再尊重sleep 60
命令,而是立即重新运行php脚本。
你可以通过在本地分别使用Alpine 3.17和3.18版本运行以下简单的docker来测试这一点:
docker run --rm -it alpine:3.17 sh -c "while [ true ]; do echo 1 & sleep 3; done;"
型
正确运行并在回显1
之间等待3秒。
docker run --rm -it alpine:3.18 sh -c "while [ true ]; do echo 1 & sleep 3; done;"
型
只是开始流1
的到屏幕上没有睡眠3秒钟。
在Python 3.18和/或BusyBox中,shell脚本的语法有什么变化吗?需要注意的是,该脚本有相同的问题,无论是像docker run
示例那样的一行代码,还是像上面的示例那样格式化的.sh
文件。
1条答案
按热度按时间yrefmtwq1#
这是busybox ash中的一个bug,已经在上游修复了,但还没有包含在发行版中(在撰写本文时,v1.36.1是最新的版本)。
修复包含在提交7362d2979434c565ae70b0ccf9d4b09d7597fb48中;因此,当新的BusyBox发行版下一次可用时,您可以预期该行为不再发生。
正如Grobo所建议的,你可以在过渡期间切换到dash:这个bug与busybox尝试调用自己的
sleep
有关。