繁体   English   中英

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

[英]How can I execute next script that wait for the previous script to complete first?

https://squidfunk.github.io/mkdocs-material/creating-your-site/#previewing-as-you-write 中,有一个命令可以启动我的文档站点。

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

我怎样才能在正确的时间被公开叫唤?

打开浏览器,在正确的时间将需要您的服务器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将失败),并且......
  • docker run推入后台意味着open在 URL 完全可用之前运行

如果是这种情况,我想知道您是否可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM