testsAndMisc/linux_configuration/scripts/digital_wellbeing/pacman/makepkg_capped.sh

44 lines
1.3 KiB
Bash
Executable File

#!/bin/bash
# Run makepkg inside a constrained user scope to protect desktop responsiveness.
set -euo pipefail
CPU_QUOTA="${MAKEPKG_CPU_QUOTA:-70%}"
MEMORY_MAX="${MAKEPKG_MEMORY_MAX:-12G}"
TASKS_MAX="${MAKEPKG_TASKS_MAX:-2048}"
NICE_LEVEL="${MAKEPKG_NICE_LEVEL:-10}"
IONICE_CLASS="${MAKEPKG_IONICE_CLASS:-2}"
IONICE_LEVEL="${MAKEPKG_IONICE_LEVEL:-7}"
if ! command -v makepkg >/dev/null 2>&1; then
echo "makepkg_capped: makepkg not found in PATH" >&2
exit 127
fi
run_makepkg_fallback() {
exec ionice -c "$IONICE_CLASS" -n "$IONICE_LEVEL" \
nice -n "$NICE_LEVEL" \
makepkg "$@"
}
if ! command -v systemd-run >/dev/null 2>&1; then
echo "makepkg_capped: systemd-run unavailable, falling back to local limits" >&2
run_makepkg_fallback "$@"
fi
# Keep builds in the user manager scope. If this fails (no user manager),
# gracefully fall back to ionice+nice only.
if ! systemd-run --user --scope --quiet true 2>/dev/null; then
echo "makepkg_capped: user systemd scope unavailable, falling back" >&2
run_makepkg_fallback "$@"
fi
exec systemd-run --user --scope --quiet --same-dir --collect \
-p "CPUQuota=${CPU_QUOTA}" \
-p "MemoryMax=${MEMORY_MAX}" \
-p "MemorySwapMax=0" \
-p "TasksMax=${TASKS_MAX}" \
ionice -c "$IONICE_CLASS" -n "$IONICE_LEVEL" \
nice -n "$NICE_LEVEL" \
makepkg "$@"