시간 초과 및 최대 메모리 제한이 있는 내 컴퓨터에서 대규모 프로세스를 실행하려고 합니다. 메모리 사용량을 처리하기 위해 cgroup을 생성하고 다음 셸 스크립트를 사용하여 프로세스를 시작했습니다.
#!/usr/bin/env bash
set -e
set -o pipefail
set -u
set -m
name="$1" && shift
"$@" &
PID=$!
if [[ -f /sys/fs/cgroup/memory/$name/cgroup.procs ]]; then
echo "[MEMLIMIT] Adding $PID to $name cgroup..."
echo "$PID" | tee "/sys/fs/cgroup/memory/$name/cgroup.procs"
else
echo "[MEMLIMIT] Was not able to set memory-limiting, create cgroup first with crtmemcgrp.sh ..."
fi
# Take job back to focus, can then be killed by Ctrl+C
fg
다음으로 프로세스 실행 시간을 최대 10분으로 제한하고 싶습니다. 그래서 다음 명령줄을 사용합니다.
$ timeout 10m ./memlimit cgroup_name ./long_process [args]
내 문제는 시간 초과가 만료되면 memlimit
스크립트가 종료되지만 종료되지 않는다는 것입니다 long_process
. 내가 이해하는 바는 timeout
coreutils 명령이 자체 프로세스 그룹을 생성하고 시작 시 여기에 추가된다는 것입니다.
따라서 모든 후속 fork()
호출도 동일한 프로세스 그룹에 있어야 하며 시간 초과로 인해 그룹이 종료되면 종료되어야 합니다.
여기서 무슨 일이 일어나고 있으며 어떻게 해결할 수 있습니까?