如何执行等待上一个脚本先完成的下一个脚本



Inhttps://squidfunk.github.io/mkdocs-material/creating-your-site/#previewing-在您写作的时候,有一个命令将启动我的文档站点。

docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material

我希望在它启动后,我会自动打开浏览器并看到它

我写了一个脚本如下

docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material
open http://localhost:8000

但事实证明,open命令无法触发,因为前一个docker run仍在保持进程不动。

如果我使用&如下,那么在页面准备好之前,open会被调用得太快

docker run --rm -it -p 8000:8000 -v ${PWD}:/docs squidfunk/mkdocs-material &
open http://localhost:8000

如何在正确的时间调用open

(仅供参考,我使用的是GNU bash, version 3.2.57(1)-release(

如何在正确的时间调用open?

正确的时间打开浏览器需要服务器mkdocs发出准备就绪的信号。由于您可能不想修改服务器的代码,您只需要等待合适的时间,然后打开页面。

手动测量一次启动时间,然后使用固定的等待时间,或者重复检查页面直到加载。

在这两种情况下,docker命令和打开页面的过程都必须并行运行。bash可以使用后台作业(... &(并行运行。由于docker -it必须在前台运行,因此我们将open作为后台作业运行。这可能看起来有点奇怪,因为我们在启动服务器之前似乎打开了网站,但请记住,这两个命令是并行运行的。

任一

# replace 2 with your measured time
sleep 2 && open http://localhost:8000 &
docker run --rm -it -p 8000:8000 -v "${PWD}:/docs" squidfunk/mkdocs-material

while ! curl http://localhost:8000 -s -f -o /dev/null; do
sleep 0.2
done && open http://localhost:8000 &
docker run --rm -it -p 8000:8000 -v "${PWD}:/docs" squidfunk/mkdocs-material

听起来像:

  • docker run是一个阻塞进程(它不会退出和/或将控制权返回到控制台(,因此
  • open从不运行(除非docker run命令被中止,在这种情况下open将失败(,并且
  • 将CCD_ 16推到后台意味着CCD_

如果是这样的话,我想知道你是否可以做一些类似的事情:

docker run ... &                          # put in background, return control to console
sleep 3                                   # sleep 3 seconds
open ...

注意:手动选择睡眠秒数(在这种情况下为3(并不理想,但通过一些测试,一个能保证URL可用性且不会让您挂起的合理数字应该是可行的

另一个"基本"选项可能是与sleep组合的循环结构,例如:

docker run ... &
while true                        # loop indefinitely
do
sleep 1                       # sleep 1 sec
open ...  2>/dev/null         # try the open
[[ $? == 0 ]] && break        # if it doesn't fail then break out of loop, ie, 
# if it does fail then repeat loop
done

相关内容

  • 没有找到相关文章

最新更新