超时处理

main
阳光少年 1 year ago
parent a7ad8d3359
commit c5fd92e9be

@ -5,12 +5,13 @@ import traceback
TARGET_LANGUAGE = set(["python", "cpp", "go", "rust", "node", "javascript"]) TARGET_LANGUAGE = set(["python", "cpp", "go", "rust", "node", "javascript"])
PROJECT_PATH = "/home/rocker/project" PROJECT_PATH = "/home/rocker/project"
BUILD_TIMEOUT_S = 3
def go_handler(): def go_handler():
source_path = f"{PROJECT_PATH}/go_project/main.go" source_path = f"{PROJECT_PATH}/go_project/main.go"
subprocess.run(["cp", "/tmp/code", source_path], capture_output=True) subprocess.run(["cp", "/tmp/code", source_path], capture_output=True)
main_path = f"{PROJECT_PATH}/go_project/main" main_path = f"{PROJECT_PATH}/go_project/main"
ret = subprocess.run(["go", "build", "-o", main_path], cwd=f"{PROJECT_PATH}/go_project", capture_output=True) ret = subprocess.run(["/usr/bin/timeout", f"{BUILD_TIMEOUT_S}s", "go", "build", "-o", main_path], cwd=f"{PROJECT_PATH}/go_project", capture_output=True)
std_err = ret.stderr.decode("utf-8") std_err = ret.stderr.decode("utf-8")
if len(std_err) > 0: if len(std_err) > 0:
return std_err, "" return std_err, ""
@ -20,7 +21,7 @@ def cpp_handler():
source_path = f"{PROJECT_PATH}/cpp_project/main.cpp" source_path = f"{PROJECT_PATH}/cpp_project/main.cpp"
subprocess.run(["cp", "/tmp/code", source_path], capture_output=True) subprocess.run(["cp", "/tmp/code", source_path], capture_output=True)
main_path = f"{PROJECT_PATH}/cpp_project/main" main_path = f"{PROJECT_PATH}/cpp_project/main"
ret = subprocess.run(["g++", source_path, "-o", main_path], capture_output=True) ret = subprocess.run(["/usr/bin/timeout", f"{BUILD_TIMEOUT_S}s", "g++", source_path, "-o", main_path], capture_output=True)
std_err = ret.stderr.decode("utf-8") std_err = ret.stderr.decode("utf-8")
if len(std_err) > 0: if len(std_err) > 0:
return std_err, "" return std_err, ""
@ -34,7 +35,7 @@ def node_handler():
def rust_handler(): def rust_handler():
source_path = f"{PROJECT_PATH}/rust_project/src/main.rs" source_path = f"{PROJECT_PATH}/rust_project/src/main.rs"
subprocess.run(["cp", "/tmp/code", source_path], capture_output=True) subprocess.run(["cp", "/tmp/code", source_path], capture_output=True)
ret = subprocess.run(["cargo", "build"], cwd=f"{PROJECT_PATH}/rust_project", capture_output=True) ret = subprocess.run(["/usr/bin/timeout", f"{BUILD_TIMEOUT_S}s", "cargo", "build"], cwd=f"{PROJECT_PATH}/rust_project", capture_output=True)
std_err = ret.stderr.decode("utf-8") std_err = ret.stderr.decode("utf-8")
if len(std_err) > 0 and ret.returncode != 0: if len(std_err) > 0 and ret.returncode != 0:
return std_err, "" return std_err, ""
@ -50,12 +51,13 @@ def python_handler():
def main(): def main():
language = sys.argv[1] language = sys.argv[1]
timeout_s = sys.argv[2]
if language not in TARGET_LANGUAGE: if language not in TARGET_LANGUAGE:
print(f"不支持的编程语言: {language}") print(f"不支持的编程语言: {language}")
return return
# 编译和执行 # 编译和执行
cmd = ["/usr/bin/time", "-f", "'%M %U %S %e'"] cmd = ["/usr/bin/time", "-f", "'%M %U %S %e'", "/usr/bin/timeout", f"{timeout_s}s"]
err = "" err = ""
if language == "python": if language == "python":
err, main_path = python_handler() err, main_path = python_handler()

@ -8,6 +8,7 @@ import traceback
app = Flask(__name__) app = Flask(__name__)
USER_NAME = "ubuntu" USER_NAME = "ubuntu"
TIMEOUT_S = 10
CGROUP_PATH = "/sys/fs/cgroup/rocker" CGROUP_PATH = "/sys/fs/cgroup/rocker"
ROCKER_PATH = f"/home/{USER_NAME}/rocker/target/debug/rocker" ROCKER_PATH = f"/home/{USER_NAME}/rocker/target/debug/rocker"
HANDLER_FILE = "handler.py" HANDLER_FILE = "handler.py"
@ -40,7 +41,7 @@ def main():
_ = subprocess.run(["sudo", ROCKER_PATH, _ = subprocess.run(["sudo", ROCKER_PATH,
"--id", _id, "--id", _id,
"--image", "base_ubuntu_image", "--image", "base_ubuntu_image",
"--run", f"python3 -u /tmp/handler.py {language}", "--run", f"python3 -u /tmp/handler.py {language} {TIMEOUT_S}",
"--env", f"/home/{USER_NAME}/rocker/quant.env", "--env", f"/home/{USER_NAME}/rocker/quant.env",
"--volume", f"{user_path}:/tmp", "--volume", f"{user_path}:/tmp",
"--log"]) "--log"])
@ -50,7 +51,7 @@ def main():
# 20s 超时 # 20s 超时
procs_path = f"{CGROUP_PATH}/{_id}/cgroup.procs" procs_path = f"{CGROUP_PATH}/{_id}/cgroup.procs"
for _ in range(2000): for _ in range(int(TIMEOUT_S * 2 / 0.01)): # *2 留出冗余
time.sleep(0.01) time.sleep(0.01)
try: try:
with open(procs_path) as f: with open(procs_path) as f:
@ -59,13 +60,11 @@ def main():
break break
except Exception as e: except Exception as e:
break break
else:
resp["msg"] = "Timeout"
resp["rt"] = time.time() - starat resp["rt"] = time.time() - starat
# 读取文件 # 读取文件
try:
log_path = f"/home/rocker/containers/{_id}/upper/logs/log" log_path = f"/home/rocker/containers/{_id}/upper/logs/log"
try:
with open(log_path) as f: with open(log_path) as f:
log_str = f"{f.read()}\n" log_str = f"{f.read()}\n"
resp["msg"] += log_str resp["msg"] += log_str

Loading…
Cancel
Save