主頁 > .NET開發 > 如何使用bash腳本同時在不同埠上運行兩個燒瓶服務器

如何使用bash腳本同時在不同埠上運行兩個燒瓶服務器

2022-04-26 02:56:00 .NET開發

我有兩個 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 腳本時,server1.py它只在我退出服務器 1時運行檔案,它運行server2.py

我的 bash 腳本的輸出:

* 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)

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

uj5u.com熱心網友回復:

希望你一切順利,

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

所以

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

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

  • 第二個是,不要在命令“python3 server1.py”的末尾使用“&&”,這意味著“只有在之前的內容被執行并成功的情況下才執行之后的內容,你可以只使用“&”,這意味著“后臺執行之前的內容并同時執行接下來的內容。這是 bash 腳本:

腳本.sh:

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

它對我來說效果很好,但問題是即使你在 bash 腳本輸出上“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 個 dockerfile 構建 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

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

如何使用 bash 腳本同時在不同埠上運行兩個燒瓶服務器

如何使用 bash 腳本同時在不同埠上運行兩個燒瓶服務器

如何使用 bash 腳本同時在不同埠上運行兩個燒瓶服務器

希望這對您有所幫助。

使用以下命令洗掉影像: docker rmi #example: docker rmi so-flask-s2

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

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

猜猜

uj5u.com熱心網友回復:

我同意@gordon-davisson 關于連接器的看法。但是,如果您正在尋找一個bash腳本來運行您的服務器,具有不同的配置,最好使用flask runflask 包提供的命令列實用程式。

此外,您無需在腳本中手動更改,以防您再次想更改埠、configurationiedebug=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 run 命令中找到有關此主題的重要資訊

uj5u.com熱心網友回復:

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463892.html

標籤:Python python-3.x 重击 烧瓶

上一篇:在Python中使用[]元素為多個串列的元素定義總和

下一篇:PythonJinja變數不要添加

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more