设置进程的超时和限制内存

设置进程的超时和限制内存

我正在尝试在我的机器上运行一个具有超时和最大内存限制的大型进程。为了处理内存使用情况,我创建了一个 cgroup 并使用此 shell 脚本来启动该进程:

#!/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.我的理解是timeoutcoreutils 的命令创建自己的进程组并在启动时将其自身添加到其中。

因此,所有后续fork()调用也应该位于同一进程组中,并在超时杀死该组时被杀死。

这里发生了什么以及我该如何解决它?

相关内容