#!/bin/bash # Create a group # param: # - type(s) (cpu, memory) # - group path function mycg_create { GRP=$(id -g -n) cgcreate -t $USER:$GRP -a $USER:$GRP -g "$1":"$2" } # Format a group path for the current session of the current user # param: group name function mycg_path { echo -n user/$UID.user/"$XDG_SESSION_ID".session/"$1" } # Initialize my groups function mycg_init { echo Init cgroups: $(mycg_path) DARKTABLE=$(mycg_path darktable) mycg_create "cpu,memory" "$DARKTABLE" # Limit a bit the memory for darktables echo $((1500*1024*1024)) > /sys/fs/cgroup/memory/"$DARKTABLE"/memory.limit_in_bytes echo 900 > /sys/fs/cgroup/cpu/"$DARKTABLE"/cpu.shares # A group for Firefox GOOGLEFOX=$(mycg_path googlefox) mycg_create "cpu,memory" "$GOOGLEFOX" echo $((800*1024*1024)) > /sys/fs/cgroup/memory/"$GOOGLEFOX"/memory.limit_in_bytes echo 500 > /sys/fs/cgroup/cpu/"$GOOGLEFOX"/cpu.shares } if [ "$1" == "init" ] then mycg_init elif [ "$1" == "run" ] then shift if [ "$#" -lt 2 ] then echo "Error: not enough args" echo "mygroup exec PROFILE_NAME COMMAND" exit 1 fi CG_GRP="$1" shift echo "Execute: group=$CG_GRP, command=$@" CG_PATH=$(mycg_path "$CG_GRP") cgexec -g memory,cpu:"$CG_PATH" "$@" else echo "Unknown command: $1" exit 2 fi