簡體   English   中英

如何使用bash腳本在不同端口同時運行兩台flask服務器

[英]How to run two flask servers on different ports at the same time using bash script

我有兩個 python 文件。

server1.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello world from server 1."


if __name__ == "__main__":
    app.run(port=3000)

server2.py

from flask import Flask

app = Flask(__name__)


@app.route('/')
def home():
    return "Hello from server 2."


if __name__ == "__main__":
    app.run(port=4000)

現在,我需要使用 bash 腳本同時運行這兩個服務器。

我在我的 bash 腳本中嘗試過這個。

python3 server1.py && python3 server2.py

當我運行這個 bash 腳本時,它只在我退出服務器 1時運行server1.py文件,它運行server2.py

我的 bash 腳本的 Output:

* Serving Flask app 'server1' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:3000 (Press CTRL+C to quit)
^C * Serving Flask app 'server2' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:4000 (Press CTRL+C to quit)

我認為不可能在一個終端中同時運行兩個 flask 服務器。 有什么方法可以使用bash打開一個新終端並在該終端上運行server2.py文件? 由於某些原因,我需要同時運行兩個 flask 服務器。

希望你一切順利,

感謝您提供腳本和服務器配置。 有了這些,我就能重現你得到的東西。

所以

我認為有多種解決方案,但我會給你兩個:

  • 第一種是將您的服務器部署到 docker 容器中,並使用 bash 腳本或 docker-compose 或其他容器平台運行它們。

  • 第二個是,不要在命令“python3 server1.py”的末尾使用“&&”,意味着“僅當執行之前的內容並成功時才執行此后的內容,您可以只使用“&”,這意味着“在后台執行之前的內容,同時執行接下來的內容。 這是 bash 腳本:

腳本.sh:

#/bin/bash
python3 server1.py &
python3 server2.py

它對我來說效果很好,但問題是,即使你在 bash 腳本 output 上“ctrl-c”,server2 也會停止,但 server1 不會停止:

❯ ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
bguess     21149  0.0  0.2 178708 26480 pts/3    S    00:48   0:00 python3 server1.py
...

你將不得不用 kill "PID_HERE" 手動殺死它(在我的例子中是 kill 21149 。)

相反,這是 docker 的解決方案:首先讓我們修改您的服務器以偵聽端口 4000 上的所有主機(因為 server1 和 server2 將被隔離在 2 個不同的容器中,因此不會發生沖突)

服務器1.py:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello world from server 1."


if __name__ == "__main__":
    app.run(port=4000, debug=True, host='0.0.0.0')

服務器2.py:

from flask import Flask

app = Flask(__name__)


@app.route('/')
def home():
    return "Hello from server 2."


if __name__ == "__main__":
    app.run(port=4000, debug=True, host='0.0.0.0')

接下來,讓我們記下構建容器鏡像所需的兩個 dockerfile:

但首先是我們將復制到 docker 圖像中的 requirements.txt 文件:

要求.txt:

flask

碼頭文件1:

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY server1.py .

CMD [ "python3", "-m" , "server1", "run", "--host=0.0.0.0:4000"]

EXPOSE 4000

碼頭文件2:

FROM python:3.8-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY server1.py .

CMD [ "python3", "-m" , "server1", "run", "--host=0.0.0.0:4000"]

EXPOSE 4000

現在讓我們從這 2 個 dockerfiles 構建 docker 個圖像:

docker build -t so-flask-s1 -f dockerfile1 .
docker build -t so-flask-s2 -f dockerfile2 .

現在讓我們運行我們的容器:

❯ docker run --rm -d -p 8081:4000 --name server1 so-flask-s1
7cfb16a63cd6de6ff2ecb9d728302a9f9ef0a848ab81a5cedf6ce9f60eaa66ae


❯ docker run --rm -d -p 8082:4000 --name server2 so-flask-s2
209013ba82f8c701ba46fd67675b9151056921a5a8b5a916e7f29b9014e7c9a1

讓我們檢查它們是否都在運行:

❯ docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED          STATUS             PORTS
            NAMES
209013ba82f8   so-flask-s2                          "python3 -m server2 …"   3 seconds ago    Up 2 seconds       0.0.0.0:8082->4000/tcp      server2
7cfb16a63cd6   so-flask-s1                          "python3 -m server1 …"   10 seconds ago   Up 9 seconds       0.0.0.0:8081->4000/tcp      server1

現在,讓我們檢查一下我們的瀏覽器:

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

希望這對您有所幫助。

刪除圖像:docker rmi #example:docker rmi so-flask-s2

使用以下命令殺死容器:docker kill #example:docker kill server2

這是一個小備忘單(但您可以在 inte.net 上找到很多備忘單): https://www.docker.com/wp-content/uploads/2022/03/docker-cheat-sheet.pdf

猜測

我同意@gordon-davisson 關於連接器的觀點。 但是,如果您正在尋找bash腳本來運行具有不同端口配置的服務器,最好使用 flask flask package 提供的flask run命令行實用程序。

此外,您不需要在腳本中手動更改端口,以防您再次想要更改端口或configuration ,即debug=True/Falsehostname=0.0.0.0 or 127.0.0.1

它的一些基礎知識是(來自它的幫助描述):

flask run --help
Usage: flask run [OPTIONS]

  Run a local development server.

  This server is for development purposes only. It does not provide the
  stability, security, or performance of production WSGI servers.

  The reloader and debugger are enabled by default if FLASK_ENV=development
  or FLASK_DEBUG=1.

Options:
  -h, --host TEXT                 The interface to bind to.
  -p, --port INTEGER              The port to bind to.
  --cert PATH                     Specify a certificate file to use HTTPS.
  --key FILE                      The key file to use when specifying a
                                  certificate.
  --reload / --no-reload          Enable or disable the reloader. By default
                                  the reloader is active if debug is enabled.
  --debugger / --no-debugger      Enable or disable the debugger. By default
                                  the debugger is active if debug is enabled.
  --eager-loading / --lazy-loader
                                  Enable or disable eager loading. By default
                                  eager loading is enabled if the reloader is
                                  disabled.
  --with-threads / --without-threads
                                  Enable or disable multithreading.
  --extra-files PATH              Extra files that trigger a reload on change.
                                  Multiple paths are separated by ':'.
  --help                          Show this message and exit.

您可以在flask 運行命令中找到有關此主題的重要信息

指定&&告訴 Bash 在運行第二個命令之前等待第一個命令成功退出
更好的解決方案可能是first_command & second_command &
這將發送兩個腳本同時在后台運行並釋放您的 TTY。
幾年前我寫了一篇關於 Linux 命令鏈的文章,根據你的要求你可能會發現它很有用。
你可以在這里閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM