linux 如何使用bash脚本正确创建cgroup?

xjreopfe  于 2022-11-22  发布在  Linux
关注(0)|答案(1)|浏览(175)

我正在尝试编写 init_cgroup.sh 脚本,该脚本将创建具有参数限制的容器。
下面是我尝试的方法:

#!/bin/sh

# args:
# $1 - mem_limit (not used at the moment)
# $2 - core usage percentage (e.g. 0.1)
# $3 - container name
GROUP_ID=$3
GROUP_PATH="/sys/fs/cgroup"

mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=0k cgroup_root $GROUP_PATH
mount -t cgroup2 none $GROUP_PATH
if [ $? != "0" ]; then
    mkdir "$GROUP_PATH/$GROUP_ID"
    mount -t cgroup -o cpu,cpuset,cpuacct,memory cgroup_cpu "$GROUP_PATH/$GROUP_ID"
    echo 100000 > "$GROUP_PATH/$GROUP_ID/cpu.cfs_quota_us"
    echo "100000*$2" > "$GROUP_PATH/$GROUP_ID/cpu.cpu.cfs_period_us"
    cpus_count=$(grep -c processor /proc/cpuinfo)
    rand_cpu=$RANDOM%cpus_count
    echo $rand_cpu > "$GROUP_PATH/$GROUP_ID/cpuset.cpus"
else 
    {
    echo "+cpu" 
    echo "+cpuset" 
    echo "+memory"
    } >> "$GROUP_PATH/cgroup.subtree_control"
    mkdir "$GROUP_PATH/$GROUP_ID"
    cpus_count=$(grep -c processor /proc/cpuinfo)
    rand_cpu=$RANDOM%$cpus_count
    echo "$rand_cpu" > "$GROUP_PATH/$GROUP_ID/cpuset.cpus"
fi

P. S.:我应该得到的结果是,我的组中的任务只在一个核心上执行,所以我将其分配给随机的cpu(临时解决方案)
使用sudo运行脚本时,它将在

  • /sys/fs/cgroup*,但输出错误:
> sudo ./init_cgroup.sh 0 0.1 testt

> ./init_cgroup.sh: 29: echo: echo: I/O error

我发现I/O错误是因为它没有足够的权限写入系统文件夹,即使我用sudo运行它。
我应该怎么处理它,我做得正确吗?

uurity8g

uurity8g1#

正如@Cyrus提到的,sh不是bash,所以第一个不是包含$RANDOM变量,echo试图在文件中写入一些垃圾。解决方法是将#!/bin/sh * 更改为 * #!/bin/bash

相关问题