New We are sorting MAX channels into categories and territories. Read the news

🐍 Python может автоматически останавливать зависшие процессы, не оставляя дочерние задачи работать в фоне



👁 При автоматизации через subprocess недостаточно установить тайм-аут: если команда запускает дочерние процессы, завершение родительского процесса не гарантирует остановку всей цепочки. В Linux можно запускать каждую задачу в отдельной группе процессов и при превышении лимита завершать всю группу.

📝 Запускаем команду с контролем времени и всей группы процессов:



import os
import signal
import subprocess

def run_task(command: list[str], timeout: int = 30) -> str:
proc = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
start_new_session=True,
)

try:
output, _ = proc.communicate(timeout=timeout)
except subprocess.TimeoutExpired:
try:
os.killpg(proc.pid, signal.SIGTERM)
except ProcessLookupError:
pass

try:
output, _ = proc.communicate(timeout=3)
except subprocess.TimeoutExpired:
try:
os.killpg(proc.pid, signal.SIGKILL)
except ProcessLookupError:
pass
output, _ = proc.communicate()

raise TimeoutError(
f"Команда превысила лимит {timeout} с.\n{output}"
)

if proc.returncode != 0:
raise subprocess.CalledProcessError(
proc.returncode, command, output=output
)

return output

print(run_task(["python", "-c", "print('Задача выполнена')"]))

📌 Как это работает:

• start_new_session=True создаёт новую сессию, в которой процесс становится лидером своей группы.
• communicate(timeout=...) ограничивает время ожидания и одновременно считывает вывод, предотвращая переполнение каналов.
• При тайм-ауте сначала отправляется SIGTERM, а затем SIGKILL, если процесс не завершился за три секунды.

❗️ Важно: завершение группы охватывает процессы, которые остаются в ней. Если дочерний процесс самостоятельно создаст новую сессию или группу, этот способ не гарантирует его остановку. Для жёсткой изоляции недоверенных задач лучше использовать отдельный cgroup или системный менеджер служб.

tags: #python #автоматизация #linux

🧭 @recura_tech
Views: 259
Open in MAX Report an inaccuracy

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go