task_kill.py 3.0 KB
# coding=utf-8
#author:        4N
#createtime:    2020/9/4
#email:         nheweijun@sina.com

from ..models import db,Task,Table,InsertingLayerName,Process

from app.modules.service.models import Image
from app.util.component.ApiTemplate import ApiTemplate
from app.util.component.StructuredPrint import StructurePrint
import os
import signal
import platform
import json
import datetime
import uuid
class Api(ApiTemplate):
    api_name = "停止任务"
    def para_check(self):
        pass

    def process(self):
        res = {}
        try:
            task_guid = self.para.get("task_guid")
            task = Task.query.filter_by(guid=task_guid).one_or_none()
            pid = task.task_pid
            try:
                if platform.system().lower().__contains__("windows"):
                    exec_result = os.popen('taskkill.exe /pid:' + str(pid))

                else:
                    #分布式下,很难吧,还需要记录机器,分布式是不可行的
                    os.kill(pid,signal.SIGILL)
            except Exception as e:
                StructurePrint.print("Kill task 失败")
                raise e

            #处理kill任务后的事情
            self.fix_task(task)

            res["msg"] = "Kill成功!"
            res["result"] = True
        except Exception as e:
            db.session.rollback()
            raise e
        return res


    def fix_task(self,task):

        if task.task_type==1:
            ilns = InsertingLayerName.query.filter_by(task_guid=task.guid).all()
            for iln in ilns:
                db.session.delete(iln)

        if task.task_type==2:
            table = Table.query.filter_by(guid=task.table_guid).one_or_none()
            if len(table.relate_table_vacuates.all())>0:
                Table.query.filter_by(guid=task.table_guid).update({"is_vacuate":1})
            else:
                Table.query.filter_by(guid=task.table_guid).update({"is_vacuate": 0})

        if task.task_type==3:
            pass
        if task.task_type==4:
            pass
        if task.task_type==5:
            Image.query.filter_by(guid=task.parameter).update({"has_pyramid":0})

        Task.query.filter_by(guid=task.guid).update({"state":-1})

        message = "{} 任务被强行中止!".format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        task_process = Process(guid=uuid.uuid1().__str__(), message=message, time=datetime.datetime.now(),
                               task_guid=task.guid)

        db.add(task_process)
        db.session.commit()
        return None

    api_doc = {
        "tags": ["任务接口"],
        "parameters": [
            {"name": "task_guid",
             "in": "formData",
             "type": "string"},
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }