|
| 1 | +import os |
| 2 | +import re |
| 3 | +import signal |
| 4 | +from pathlib import Path |
| 5 | +from json import dumps, loads |
| 6 | +from urllib.parse import urljoin |
| 7 | +from typing import Dict, List, Union |
| 8 | +from time import time |
| 9 | + |
1 | 10 | from fastapi import HTTPException, status, UploadFile
|
2 | 11 | from fastapi.responses import FileResponse
|
3 | 12 | from httpx import AsyncClient, Timeout
|
4 |
| -from json import dumps, loads |
5 | 13 | from logging import Logger
|
6 |
| -from pathlib import Path |
7 | 14 | from requests import get as requests_get
|
8 |
| -from typing import Dict, List, Union |
9 |
| -from urllib.parse import urljoin |
| 15 | +from requests_unixsocket import sys |
10 | 16 |
|
11 | 17 | from ocrd.resolver import Resolver
|
12 | 18 | from ocrd.task_sequence import ProcessorTask
|
@@ -241,3 +247,25 @@ def validate_first_task_input_file_groups_existence(logger: Logger, mets_path: s
|
241 | 247 | if group not in available_groups:
|
242 | 248 | message = f"Input file group '{group}' of the first processor not found: {input_file_grps}"
|
243 | 249 | raise_http_exception(logger, status.HTTP_422_UNPROCESSABLE_ENTITY, message)
|
| 250 | + |
| 251 | + |
| 252 | +def kill_mets_server_zombies(minutes_ago=60) -> List[int]: |
| 253 | + now = time() |
| 254 | + cmdline_pat = r'.*ocrd workspace -U.*server start $' |
| 255 | + ret = [] |
| 256 | + for procdir in sorted(Path('/proc').glob('*'), key=os.path.getctime): |
| 257 | + if not procdir.is_dir(): |
| 258 | + continue |
| 259 | + cmdline_file = procdir.joinpath('cmdline') |
| 260 | + if not cmdline_file.is_file(): |
| 261 | + continue |
| 262 | + ctime_ago = int((now - procdir.stat().st_ctime) / 60) |
| 263 | + if ctime_ago < minutes_ago: |
| 264 | + continue |
| 265 | + cmdline = cmdline_file.read_text().replace('\x00', ' ') |
| 266 | + if re.match(cmdline_pat, cmdline): |
| 267 | + pid = procdir.name |
| 268 | + ret.append(pid) |
| 269 | + print(f'METS Server with PID {pid} was created {ctime_ago} minutes ago, more than {minutes_ago}, so killing (cmdline="{cmdline})', file=sys.stderr) |
| 270 | + os.kill(int(pid), signal.SIGTERM) |
| 271 | + return ret |
0 commit comments