如何在Shell脚本中同时运行Flask与Prometheus服务?
如何在Shell脚本中同时启动Flask和Prometheus服务器
你的问题出在Shell脚本的同步执行机制:默认情况下,脚本会等待当前命令执行完成(进程退出)才会执行下一行代码。python hello.py启动Flask后会一直前台运行,直接阻塞了后续的Prometheus启动命令。
下面是两种可行的修改方案:
方案1:直接后台运行进程
在启动命令末尾添加&,将进程放到后台执行,脚本会继续执行后续命令。同时建议重定向日志到文件,方便后续排查问题:
#!/bin/bash # 激活Flask虚拟环境 . /home/ec2-user/flask/venv/bin/activate # 后台启动Flask,并重定向日志到文件 python /home/ec2-user/flask/hello.py > /home/ec2-user/flask/flask.log 2>&1 & # 启动Prometheus,同样后台运行并记录日志 cd /home/ec2-user/prometheus/prometheus-2.39.1.linux-amd64/ sudo ./prometheus > /home/ec2-user/prometheus/prometheus.log 2>&1 & # 可选:让脚本等待所有后台进程结束,避免脚本退出后进程被意外终止 wait
&:将进程转入后台运行,脚本无需等待该进程退出即可继续执行下一行> /path/to/log.log 2>&1:将标准输出和错误输出合并写入日志文件,默认情况下后台进程的输出会关联到当前终端,关闭终端可能导致进程退出wait:让脚本保持运行状态,直到所有后台启动的进程都结束,适合在终端手动启动脚本的场景
方案2:确保Flask启动后再启动Prometheus
如果需要保证Flask完全启动(端口监听正常)后再启动Prometheus,可以添加端口检查逻辑:
#!/bin/bash . /home/ec2-user/flask/venv/bin/activate python /home/ec2-user/flask/hello.py > /home/ec2-user/flask/flask.log 2>&1 & # 等待Flask的5000端口(默认端口)监听成功 until nc -z localhost 5000; do sleep 1 done cd /home/ec2-user/prometheus/prometheus-2.39.1.linux-amd64/ sudo ./prometheus > /home/ec2-user/prometheus/prometheus.log 2>&1 & wait
nc -z localhost 5000:检查本地5000端口是否处于监听状态until循环:每隔1秒检查一次,直到端口可用再执行后续的Prometheus启动命令
注意:如果你的Flask使用了非默认端口,需要把
5000替换成实际端口。
内容的提问来源于stack exchange,提问作者cloud-engineer
相关产品推荐
相关产品推荐

