我正在尝试编写 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运行它。
我应该怎么处理它,我做得正确吗?
1条答案
按热度按时间uurity8g1#
正如@Cyrus提到的,
sh
不是bash
,所以第一个不是包含$RANDOM
变量,echo
试图在文件中写入一些垃圾。解决方法是将#!/bin/sh
* 更改为 *#!/bin/bash