簡體   English   中英

在Python中生成長期運行的后台任務

[英]Spawn Long Running Background Task In Python

我正在嘗試設置一個Flask應用程序,該應用程序在收到請求時將運行Shell腳本。 目的是在我推送到GitLab時重新部署另一個應用程序。 我已經連接了所有東西,但是由於某種原因,Flask應用程序產生的子進程在啟動后不久就終止了。 我一直在通過SSH登錄服務器以啟動Flask應用程序,只要我保持登錄狀態,一切就可以正常工作,但是一旦我殺死了該會話,它將停止工作。

燒瓶應用

from flask import Flask, request, abort, Response
import os
import subprocess
from waitress import serve

process:subprocess.Popen = None

app = Flask(__name__)

@app.route('/',  methods = ['POST'])
def deploy():
    req_secret = request.headers.get("X-Gitlab-Token")
    if req_secret is not None:
        if 'DEPLOY_SECRET' in os.environ:
            if os.environ['DEPLOY_SECRET'] == req_secret:
                global process
                if process is not None:
                    process.terminate()
                process = subprocess.Popen("./deploy.sh", stdout=subprocess.PIPE, shell=True)
                return 'Success'
    abort(401)

if __name__ == "__main__":
    serve(app, port=5000)

deploy.sh

#!/bin/sh
killall server
cd ..
git pull origin master
diesel migration run
cargo run

運行

#!/bin/sh
DEPLOY_SECRET=$1 pipenv run python autodeploy.py

cargo run應該永遠運行,並且只要我保持登錄SSH會話的時間就可以運行。 我通過運行./run &啟動flask應用程序

也許您的女服務員服務器沒有運行腳本的特權。 嘗試將onwership的腳本更改為“ waitress_user”,例如:

chown your_waitress_user deploy.sh

我不確定用戶名,可能是“女服務員”。

原來的解決方案是在python腳本中使用nohup

from flask import Flask, request, abort, Response
import os
import subprocess
from waitress import serve

process:subprocess.Popen = None

app = Flask(__name__)

@app.route('/',  methods = ['POST'])
def deploy():
    req_secret = request.headers.get("X-Gitlab-Token")
    if req_secret is not None:
        if 'DEPLOY_SECRET' in os.environ:
            if os.environ['DEPLOY_SECRET'] == req_secret:
                global process
                if process is not None:
                    process.terminate()
                with open("autodeploy.log", "a+") as log_file:
                    process = subprocess.Popen(["nohup", "./deploy.sh"], stdout=log_file, stderr=log_file)
                return 'Success'
    abort(401)

if __name__ == "__main__":
    serve(app, port=5000)

暫無
暫無

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

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