タイムアウトと最大メモリ制限があるマイコンピュータで大規模なプロセスを実行しようとしています。メモリ使用量を処理するために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()
呼び出しも同じプロセスグループに存在し、タイムアウトのためにグループが終了したときに終了する必要があります。
ここで何が起こっているのか、どうすれば解決できますか?